Gstreamer保存RTSP流生成视频缺失时长信息如何修复?
问题根源
你当前生成的MKV文件无法在VLC中显示时长,核心原因有两点:
matroskamux默认处理实时RTSP流时会开启流式写入模式(streamable=true),该模式为网页端渐进式播放优化,不会写入需要等流结束才能确定的总时长、seek索引等元数据。- 你启动pipeline时没有加
-e参数,手动中断录制时(比如按Ctrl+C)pipeline会直接退出,复用组件没有收到流结束(EOS)信号,没机会把收尾的元数据补写到文件中,播放器自然读不到时长字段。
调整方案
保留原有转码逻辑的修改后Pipeline
如果你确实需要将RTSP流转码为x264编码存储,直接用以下命令即可:
gst-launch-1.0 -e -q rtspsrc location=rtsp://<ip>:<port>/video ! decodebin ! autovideoconvert ! x264enc pass=5 quantizer=25 speed-preset=6 ! h264parse ! matroskamux streamable=false ! filesink location=<filename>
关键调整说明
- 新增
-e启动参数:该参数会让gst-launch在收到中断信号(Ctrl+C)时,自动向整个pipeline发送EOS信号,等待复用组件写完所有元数据后再退出,不会出现文件截断缺元数据的问题。 - 给
matroskamux添加streamable=false属性:关闭流式写入模式,muxer会在收到EOS后自动回填文件总时长、生成完整的seek索引表,输出完全符合MKV规范的可正常识别时长、支持进度条拖动的视频文件。
可选优化(长时间录制场景)
如果是数小时级别的长时间录制,担心中途进程异常崩溃导致已录内容元数据缺失,可以给matroskamux增加定期写索引的参数,示例:
gst-launch-1.0 -e -q rtspsrc location=rtsp://<ip>:<port>/video ! decodebin ! autovideoconvert ! x264enc pass=5 quantizer=25 speed-preset=6 ! h264parse ! matroskamux streamable=false min-index-interval=10000000000 ! filesink location=<filename>
其中min-index-interval=10000000000单位为纳秒,对应每10秒写入一次索引,就算中途异常退出,已录制的前序内容也能被播放器正常识别。
无转码高效录制方案
如果你的RTSP源本身就是H264编码,不需要二次转码,可以直接提取原始H264流封装,CPU占用不到转码方案的10%,画质也不会因为重编码受损,pipeline如下:
gst-launch-1.0 -e -q rtspsrc location=rtsp://<ip>:<port>/video ! rtph264depay ! h264parse ! matroskamux streamable=false ! filesink location=<filename>
注意:停止录制时请正常按Ctrl+C触发退出,不要用
kill -9强杀进程,否则复用组件来不及写入收尾元数据,还是会出现时长缺失的问题。
内容的提问来源于stack exchange,提问作者Lucas Nascimento
相关产品推荐
相关产品推荐

