97 lines
5.1 KiB
Markdown
97 lines
5.1 KiB
Markdown
|
---
|
|||
|
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
|
|||
|
```
|