---
title: "📷 Преобразование видео с USB камеры в RTSP поток"
date: 2023-09-26T23:29:24+03:00
draft: false
tags: [video, tools, tips]
---

## mediamtx

В качестве сервера будет использоваться [`mediamtx`](https://github.com/bluenviron/mediamtx).

> Из описания на GitHub:  
> Ready-to-use SRT / WebRTC / RTSP / RTMP / LL-HLS media server
> and media proxy that allows to read, publish, proxy and record video and audio streams.

Сервер написан на Go, есть сборки для RaspberryPi.
Хороший файл конфигурации.

## Преобразовываем `v4l2` в `rtsp` поток

В файле `mediamtx.yml` в самый конец (в параметр `path`) добавляем следующий код,
где `/dev/video0` это захватываемое устройство.

```text
  cam:
    runOnInit: ffmpeg -f v4l2 -i /dev/video0 -pix_fmt yuv420p -preset ultrafast -b:v 600k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH
    runOnInitRestart: yes
```

Запускаем сервер и получаем такой выхлоп.

```text
2023/09/26 23:35:32 INF MediaMTX v1.1.1
2023/09/26 23:35:32 INF [path cam] runOnInit command started
2023/09/26 23:35:32 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2023/09/26 23:35:32 INF [RTMP] listener opened on :1935
2023/09/26 23:35:32 INF [HLS] listener opened on :8888
2023/09/26 23:35:32 INF [WebRTC] listener opened on :8889 (HTTP)
2023/09/26 23:35:32 INF [SRT] listener opened on :8890 (UDP)
ffmpeg version n6.0 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13.2.1 (GCC) 20230801
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libjxl --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-opencl --enable-opengl --enable-shared --enable-version3 --enable-vulkan
  libavutil      58.  2.100 / 58.  2.100
  libavcodec     60.  3.100 / 60.  3.100
  libavformat    60.  3.100 / 60.  3.100
  libavdevice    60.  1.100 / 60.  1.100
  libavfilter     9.  3.100 /  9.  3.100
  libswscale      7.  1.100 /  7.  1.100
  libswresample   4. 10.100 /  4. 10.100
  libpostproc    57.  1.100 / 57.  1.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 9930.712260, bitrate: 147456 kb/s
  Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn
[out#0/rtsp @ 0x56233731f280] Codec AVOption preset (Encoding preset) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg4 (native))
Press [q] to stop, [?] for help
2023/09/26 23:35:32 INF [RTSP] [conn [::1]:54944] opened
2023/09/26 23:35:32 INF [RTSP] [session 13c1b9af] created by [::1]:54944
2023/09/26 23:35:32 INF [RTSP] [session 13c1b9af] is publishing to path 'cam', 1 track (MPEG-4 Video)
Output #0, rtsp, to 'rtsp://localhost:8554/cam':
  Metadata:
    encoder         : Lavf60.3.100
  Stream #0:0: Video: mpeg4, yuv420p(tv, progressive), 640x480, q=2-31, 600 kb/s, 30 fps, 90k tbn
    Metadata:
      encoder         : Lavc60.3.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/600000 buffer size: 0 vbv_delay: N/A
frame=  546 fps= 31 q=7.0 size=N/A time=00:00:18.20 bitrate=N/A dup=281 drop=0 speed=1.03x   
```

Видим, что сервер запустил различчные протоколы:
`RTSP`, `RTMP`, `HLS`, `WebRTC`, `SRT`.

```text
INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
INF [RTMP] listener opened on :1935
INF [HLS] listener opened on :8888
INF [WebRTC] listener opened on :8889 (HTTP)
INF [SRT] listener opened on :8890 (UDP)
```

`mediamtx` запустил `ffmpeg`,
который стримит видео из `/dev/video0`
в `rtsp://localhost:8554/cam`.

```text
Input #0, video4linux2,v4l2, from '/dev/video0':
Output #0, rtsp, to 'rtsp://localhost:8554/cam':
```

Проверить можно с помощью любого проигрывателя, например `mpv`.

```sh
mpv rtsp://localhost:8554/cam --profile=low-latency --untimed
```
