我试图通过Gstreamer制作视频,经过多次研究后,我发现matroskamux和filesink插件会这样做,但它不起作用。
这是我的管道:
gst-launch-1.0 videotestsrc ! x264enc ! h264parse ! matroskamux ! filesink location=test.mkv
我创建了一个5秒的视频:
^Chandling interrupt.
Interrupt: Stopping pipeline ...
Execution ended after 0:00:05.989791758
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
当我从gstreamer运行发现应用程序时:
user@IM00343:~/Desktop$ gst-discoverer-1.0 test.mkv
Analyzing file:///home/user/Desktop/test.mkv
Done discovering file:///home/user/Desktop/test.mkv
Topology:
container: Matroska
video: H.264
Properties:
Duration: 0:00:00.566333333
Seekable: yes
Tags:
container format: Matroska
video codec: H264
minimum bitrate: 989280
bitrate: 1045608
maximum bitrate: 989280
持续时间为0:00:00.566333333,无论实际视频持续时间如何,此值均相同!视频不可寻找。
我做错了什么?
答案 0 :(得分:2)
您需要向管道发送EOS(流结束)事件,以允许元素正确完成其流。如果没有这个,多路复用器将无法正确完成文件并编写只能在处理完所有内容后才能写入的索引和标头。将管道设置为NULL作为中断会立即停止所有操作,而复用器将使文件未完成。
在gst-launch中,-e
标志应该在推送管道之前推送并等待EOS。在代码中,如果要中断录制,则需要自己发送事件,然后等待GstBus上的EOS接收。
某些输入(如文件)已结束。在这些情况下,源元素通常会在完成读取时发送EOS。对于从理论上无限的流中读取的源(例如摄像机)而言,情况并非如此。