使用gstreamer将h264视频转换为非分段mp4时,时序丢失

时间:2016-03-12 20:15:48

标签: gstreamer mp4 h.264

我想从matroska源创建一个非分段的.mp4视频。我见过this post并创建了一个类似的管道。我的源码只包含h264视频而且没有声音,所以我的管道看起来像这样:

gst-launch-1.0 filesrc location=x.mkv ! matroskademux ! h264parse ! mp4mux ! filesink location=x.mp4

但是,对结果运行gst-discoverer-1.0会给出0:00:00.000000000的持续时间。此外,vlc无法播放生成的.mp4文件,也无法在HTML5 <video>元素中使用(这是此转换的最终目的)。

如果我通过将fragment-duration=1000添加到mp4mux元素来创建分段.mp4,那么vlc可以播放.mp4,但这不是我想要的。 我需要一个知道总长度的.mp4。我做错了什么?

其他信息:长度出现在matroska来源中,由gst-discoverer-1.0显示,vlc可以显示该来源。我也可以用gstreamer重放非分段的.mp4(使用gst-launch-1.0 filesrc location=x.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink)。检查生成的.dot文件会显示qtdemux的帧速率为10000/1,这似乎很奇怪。

1 个答案:

答案 0 :(得分:1)

解决方案是将disable-passthrough=true添加到h264parse元素,因此管道现在看起来像这样:

gst-launch-1.0 filesrc location=x.mkv ! \
matroskademux ! \
h264parse disable-passthrough=true ! \
mp4mux ! \
filesink location=x.mp4

现在生成的.mp4文件包含时间信息,可以很好地与vlc以及<video>标签一起播放,包括前进/后退导航。