使用GStreamer无损转封装DVD指定标题视频的时间戳错误问题
解决GStreamer转封装DVD视频时matroskamux时间戳错误丢帧问题
核心问题出在DVD视频流的时间戳基准与matroskamux的要求不匹配:dvdsrc输出的MPEG-2视频缓冲区时间戳是基于DVD标题/章节的局部时间,而非matroskamux需要的全局连续递增时间轴,导致复用器判定时间戳无效并丢弃缓冲区。以下是针对性的解决办法:
1. 添加identity元素重置时间戳
用identity sync=false忽略输入缓冲区的原始时间戳,让matroskamux基于当前运行时间生成符合要求的新时间戳,这是最直接的修复方案:
gst-launch-1.0 dvdsrc title=1 ! mpegpsdemux name=demux \ demux.video_0 ! queue ! capsfilter caps="video/mpeg, mpegversion=2, framerate=25/1, width=720, height=576, pixel-aspect-ratio=16/9" ! identity sync=false ! matroskamux \ demux.audio_0 ! queue ! matroskamux ! filesink location=output.mkv
注:capsfilter里的参数请根据你的DVD实际视频参数调整,可通过gst-inspect-1.0 dvdsrc或播放时的调试信息获取。
2. 替换解复用器为tsdemux
部分DVD的PS流时间戳处理不够规范,tsdemux对时间戳的解析和同步更友好,尝试替换解复用组件:
gst-launch-1.0 dvdsrc title=1 ! tsdemux name=demux \ demux.video_0 ! queue ! identity sync=false ! matroskamux \ demux.audio_0 ! queue ! matroskamux ! filesink location=output.mkv
3. 调整matroskamux的同步模式
设置matroskamux sync-mode=2强制所有流对齐到全局时间轴,进一步确保时间戳有效性:
gst-launch-1.0 dvdsrc title=1 ! mpegpsdemux name=demux \ demux.video_0 ! queue ! identity sync=false ! matroskamux sync-mode=2 \ demux.audio_0 ! queue ! matroskamux ! filesink location=output.mkv
额外验证步骤
如果想确认原始时间戳的问题,可以用probe查看dvdsrc输出的视频时间戳:
gst-launch-1.0 dvdsrc title=1 ! mpegpsdemux ! video/x-mpeg,mpegversion=2 ! queue ! identity probe=true ! fakesink
终端输出中如果出现不连续、负数或跳变的时间戳,就说明必须用identity重置时间戳才能让matroskamux正常工作。
补充:播放时正常是因为视频sink元素会自动兼容不规范的时间戳,而文件复用器对时间戳的连续性和有效性要求更严格,这就是播放流畅但转封装卡顿的原因。
内容的提问来源于stack exchange,提问作者jonesmz
相关产品推荐
相关产品推荐

