如何使用 Gstreamer 制作可搜索的视频
How to make a seekable video with Gstreamer
我正在尝试使用 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,无论真实视频时长如何,这个值都是一样的!而且该视频不可搜索。
我做错了什么?
您需要向管道发送 EOS(流结束)事件,以允许元素正确完成它们的流。没有这个,混合器将无法正确完成文件并写入索引和 headers 只有在处理完所有内容后才能写入的内容。像中断一样将管道设置为 NULL 将立即停止一切,混合器将使文件未完成。
在 gst-launch 中,-e
标志应使其在停止管道之前推送并等待 EOS。在代码中,如果你想中断录音,你需要自己发送事件,然后等待 GstBus 接收到 EOS。
一些输入例如文件有结束。在这些情况下,源元素通常会在完成读取时发送 EOS 本身。对于从理论上无限的流中读取的源,例如相机,情况并非如此。
我正在尝试使用 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,无论真实视频时长如何,这个值都是一样的!而且该视频不可搜索。
我做错了什么?
您需要向管道发送 EOS(流结束)事件,以允许元素正确完成它们的流。没有这个,混合器将无法正确完成文件并写入索引和 headers 只有在处理完所有内容后才能写入的内容。像中断一样将管道设置为 NULL 将立即停止一切,混合器将使文件未完成。
在 gst-launch 中,-e
标志应使其在停止管道之前推送并等待 EOS。在代码中,如果你想中断录音,你需要自己发送事件,然后等待 GstBus 接收到 EOS。
一些输入例如文件有结束。在这些情况下,源元素通常会在完成读取时发送 EOS 本身。对于从理论上无限的流中读取的源,例如相机,情况并非如此。