opencv - 将多个 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
解决方案
您是否尝试过 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
当然,您需要添加您的 rtsp 网址并根据您的视频大小(我的是 720p)调整 videomixer xpos/ypos 属性。
在混合之前,您可能希望一次只运行一个,以确保您正确安装了所有依赖项
gst-launch-1.0 rtspsrc location=rtsp_url1 ! rtph264depay ! h264parse ! decodebin ! x264enc ! mp4mux ! filesink location=./out.mp4 sync=true
我还没有添加音频。
推荐阅读
- angular - Angular 8 + Laravel 6 表单数据
- c - 试图检查 C 中的缓冲区是否为空?
- web-applications - 如何使用 CI/CD 设置在云上部署 3 层 Web 应用程序
- r - 如何重新编码和制作虚拟变量?
- javascript - 使用传单在 Angular 中缩小时隐藏标记
- python - Pygame - 我可以让音乐有一个介绍,然后是一个循环点吗?
- sql - InfluxDB:不支持使用 CASE WHEN 进行连续查询。如何获得相同的结果(即:使用连接?)
- swift - 我对 Swift 中的值类型 () 感到困惑。它是什么,我打算如何使用它?
- apache-kafka - 无法在本地机器上创建多个代理:common.InconsistentBrokerIdException
- excel - 有条件的,我怎样才能使操作自动化?