gpt4 book ai didi

python - 在 gstreamer 中连接视频文件(在 python 中)

转载 作者:行者123 更新时间:2023-11-28 22:47:11 28 4
gpt4 key购买 nike

我正在尝试获取一系列视频片段文件(.flv 格式,都具有相同的音频/视频编码),并将它们连接到一个新文件(.mp4 格式)。我的编码管道对于普通的单段文件工作得很好,但是一旦我添加了第二个段,我就很难让它正常工作。

在我当前的实现中,我有一个用于 EOS 消息的消息处理程序:

    def on_eos(self, bus, msg):
remain = len(self.metadata['localSegments'])
logger.warning("Hit EOS Probe: %d segments left" % remain)
if remain == 0:
self.abort = True
self.mainloop.quit()
return

duration = self.pipeline.query_duration(Gst.Format(Gst.Format.TIME))[1]
self.offset += duration
logger.info("Duration: %s, new offset: %s" % (Gst.TIME_ARGS(duration),
Gst.TIME_ARGS(self.offset)))
self.pipeline.set_state(Gst.State.READY)
self.localInFile = self.metadata['localSegments'].pop(0)
logger.info("Starting new file: %s" % self.localInFile)
self.elem_src.set_property('location', self.localInFile)
self.elem_src_src.set_offset(self.offset)
self.pipeline.set_state(Gst.State.PLAYING)

这显示了最后一段的持续时间,并尝试将下一段的偏移量设置为上一段的结尾。这确实可以转码,但它总是寻求回到输出文件的开头并覆盖以前的内容。显然这不是我想要的输出!

我在这里遗漏了什么吗?我试过用这个作为 pad 探针,但是它不会让我停止并从它自己的线程重新启动管道,并且崩溃得很惨(告诉我在消息处理程序中执行它,这就是我现在拥有的) .

最佳答案

filesink 总是覆盖现有文件。您在这里真正想要的是将新片段附加到现有的 MP4 文件(而且您不想只是将另一个 MP4 文件附加到现有文件的末尾)。

为此您必须做的是,您必须通过 pad 探针在 muxer 前面的 srcpad 上捕获 EOS 事件(不是消息)。从 pad 探针回调中,您将取消链接 srcpad 和 muxer 的 sinkpad。然后您将动态链接一个新的输入并将其链接到多路复用器,同时像您已经做的那样设置 pad 偏移量。永远不要更改管道的状态,对于最后一段,您将让 EOS 事件通过并等待 EOS 消息(不是事件!)发布到总线上。然后才关闭管道。

现在所有这一切的棘手部分是您可能还想清理旧的段。由于 EOS 是从流式传输线程发送的,因此您不能从 pad 探针回调中执行此操作。您需要在这里做的是(在从 pad 探针回调取消链接后!)您将从另一个线程的管道中删除与旧段相关的元素,将它们的状态设置为 GST_STATE_NULL,然后取消引用它们。

关于python - 在 gstreamer 中连接视频文件(在 python 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26593513/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com