首页 > 解决方案 > 如何等待 x264enc 在流结束时对缓冲帧进行编码

问题描述

我有一个 Python GStreamer 应用程序,它使用 appsrc 来记录 mp4 文件。

问题是,尽管指定tune=zerolatency了 x264enc,但仍有延迟,并且在将 eos 发送到管道时,输出视频会被截断。根据机器的不同,延迟很长,导致输出文件比预期的短得多。

如果我更改管道以将视频另存为 AVI 文件,它不会被截断。不幸的是,生成的文件大约为每分钟 2 GB,而 H.264 为每分钟 12 MB。

这是 x264enc 管道:

appsrc name=appsrc format=time is-live=true caps=video/x-raw,format=(string)BGR appsrc. ! videoconvert ! x264enc tune=zerolatency ! qtmux ! filesink location=out.mp4

当应用程序完成后,它会向appsrc 和管道发送流结束消息:

if self._appsrc.emit("end-of-stream") == Gst.FlowReturn.OK:
    self._sink_pipeline.send_event(Gst.Event.new_eos())

有没有办法让我的应用程序在 x264enc 处理其缓冲区时等待?也许是一条消息?我不在乎需要多长时间才能完成。重要的是推送到的所有帧appsrc都写入输出视频文件。

标签: gstreamerpython-gstreamer

解决方案


实际上,您必须等待该 End-Of-Stream 事件通过管道,然后才能停止它。当所有接收器都收到 End-Of-Stream 时,一条 End-Of-Stream 消息将发送到管道的总线。

像这样的东西:

# <send EOS event>

self._sink_pipeline.get_bus().timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.EOS)

# <stop pipeline>

推荐阅读