Запись нескольких потоков RTSP в один файл

Мне нужно записать 4 потока RTSP в один файл.

Потоки должны быть размещены в видео таким образом:

 ---------- ---------- 
|          |          |
| STREAM 1 | STREAM 2 |
|          |          |
|----------|----------|
|          |          |
| STREAM 3 | STREAM 4 |
|          |          |
 ---------- ----------

Мне нужно синхронизировать эти потоки в прямом эфире с точностью до ~ 1 секунды. Это сложно, потому что потоки имеют переменную частоту кадров (FPS).

Я пробовал ffmpeg, но потоки не синхронизируются. Вот код:

ffmpeg \
  -i "rtsp://IP-ADDRESS/cam/realmonitor?channel=1&subtype=00" \
  -i "rtsp://IP-ADDRESS/live?real_stream" \
  -i "rtsp://IP-ADDRESS/live?real_stream" \
  -i "rtsp://IP-ADDRESS/live?real_stream" \
  -filter_complex " \
    nullsrc=size=1920x1080 [base]; \
    [0:v] scale=960x540 [video0]; \
    [1:v] scale=960x540 [video1]; \
    [2:v] scale=960x540 [video2]; \
    [3:v] scale=960x540 [video3]; \
    [base][video0] overlay=shortest=1:x=0:y=0 [tmp1]; \
    [tmp1][video1] overlay=shortest=0:x=960:y=0 [tmp2]; \
    [tmp2][video2] overlay=shortest=0:x=0:y=540 [tmp3]; \
    [tmp3][video3] overlay=shortest=0:x=960:y=540 [v]; \
    [0:a]amix=inputs=1[a]" \
  -map "[v]" -map "[a]" -c:v h264 videos/test-combine-cams.mp4

Есть ли способ объединить и синхронизировать потоки в ffmpeg или с помощью других утилит, таких как: vlc, openRTSP, Открыть резюме?


person John    schedule 13.12.2019    source источник
comment
Взгляните на захват нескольких потоков RTSP с помощью OpenCV . Идея состоит в том, чтобы использовать некоторую структуру графического интерфейса, в данном случае PyQt в качестве макета для каждого потока.   -  person nathancy    schedule 13.12.2019
comment
@nathancy Я запускаю этот код на сервере без пользовательского интерфейса. OpenCV — очень хорошая библиотека, но я обнаружил, что она не обрабатывает аудиопотоки.   -  person John    schedule 15.12.2019
comment
Проблема связана с наличием нескольких источников звука или с переменной частотой кадров видео? Если он работает с одним источником звука, предварительно объедините их с помощью отдельных вызовов ffmpeg в один простой формат и объедините с видео.   -  person karmakaze    schedule 21.12.2019
comment
@karmakaze У нас есть один источник звука (ПОТОК 1). Мы пытались использовать ffmpeg для сохранения каждого потока в отдельный файл, а затем объединять их в один файл. Но проблема в том, что некоторые потоки начинают записываться на две-три секунды позже и конечное видео не синхронизируется должным образом. Может быть, можно установить временные метки на что-то вроде временной метки UNIX, а затем использовать эти временные метки для синхронизации конечного видео?   -  person John    schedule 06.01.2020


Ответы (1)


Вы пробовали gstreamer, он работает с моими потоками rtsp.

gst-launch-1.0 -e rtspsrc location=rtsp_url1 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! m.sink_0 \
               rtspsrc location=rtsp_url2 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! m.sink_1 \
               rtspsrc location=rtsp_url3 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! m.sink_2 \
               rtspsrc location=rtsp_url4 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! m.sink_3 \
               videomixer name=m sink_1::xpos=1280 sink_2::ypos=720 sink_3::xpos=1280 sink_3::ypos=720 ! x264enc ! mp4mux ! filesink location=./out.mp4 sync=true

Конечно, вам нужно будет добавить URL-адреса rtsp и настроить свойства видеомикшера xpos/ypos в зависимости от размера вашего видео (у меня было 720p).

Перед микшированием вы можете запускать только по одному, чтобы убедиться, что все зависимости установлены правильно.

gst-launch-1.0 rtspsrc location=rtsp_url1 ! rtph264depay ! h264parse ! decodebin ! x264enc ! mp4mux ! filesink location=./out.mp4 sync=true

Я еще не добавил звук.

person shortcipher3    schedule 13.12.2019