使用 Gstreamer 将 RTSP 摄像机 H.264 流录制为 MP4

问题描述

我正在开发一个应用程序,从 RTSP 摄像头接收 H.264 视频流,并在不进行转码的情况下将其显示和存储为 MP4。就我目前的测试而言,我只录制了 5 秒。

我的问题是 MP4 无法播放。结果文件的大小从应用程序的一次运行到另一次运行都显示出非常错误内容(因为录制时间是固定的,所以出乎意料)。

这是我的管道:

rtspsrc location = rtsp://192.168.0.61:8554/quality_h264 latency=0 ! rtph264depay ! h264parse ! video/x-h264,stream-format=avc ! queue ! interpipesink name=cam1
interpipesrc allow-renegotiation=true name=src listen-to=cam1 is-live=true ! h264parse ! queue ! decodebin ! autovideoconvert ! d3dvideosink sync=false
interpipesrc allow-renegotiation=true name=src listen-to=cam1 is-live=true ! h264parse ! queue ! mp4mux ! filesink location=test.mp4

在下一步中,我将添加更多摄像机,并且需要能够动态更改录制到 MP4 的摄像机,以及暂停/恢复录制。出于这个原因,我选择使用 interpipesink/src。它是一组允许在两个独立管道之间进行通信的 gstreamer 元素。 https://github.com/RidgeRun/gst-interpipe

一个线程等待 10 秒,然后在第三个管道(记录)上发送 EOS。然后,当总线接收到 GST_MESSAGE_EOS 时,它将管道状态设置为 NULL。我已经用焊盘探针检查过,确实在文件接收器的接收器焊盘上收到了 EOS 事件。

我使用以下代码发送 EOS:gst_element_send_event(m_pipeline,gst_event_new_eos()); m_pipeline 是第三个管道。

当 gst-launch 在末尾添加 -e 时,这些精确的管道会生成可播放的 MP4。

如果我在我的应用程序中用 matroskamux 替换 mp4mux,则 mkv 可以播放并且具有预期的大小。但是,时间戳有问题,因为播放器显示它从 10 秒而不是 0 开始。在将缓冲区传递给多路复用器(mp4mux 或 matroskamux)之前,我是否需要编辑时间戳?

在我看来好像 MP4 没有完全写入,但我看不出除了发送 EOS 还能做什么? 我愿意接受重构应用程序的建议,以防使用 interpipe 元素可能会导致问题(尽管我目前不知道为什么)。

我在 Windows 10 (x64) 上使用 Gstreamer 1.18.2。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)