当关闭从 appsrc 读取帧、对其进行编码并将其写入文件的 GStreamer 管道时,我注意到虽然我已将
N
缓冲区推入 appsrc,但该文件只有 N-1
帧50% 的时间(其余时间是N
)。
我在 Ubuntu 上使用 GStreamer 1.14.5,我尝试使用以下两种方式发送 EOS 动作信号:
self._pipeline.send_event(Gst.Event.new_eos())
# and
self._appsrc.send_event(Gst.Event.new_eos())
我能够通过调用 appsrc 方法
end_of_stream
而不是发出动作信号来解决我的问题。 文档说这两种方法中的任何一种都应该有效,所以我认为 GStreamer 1.14.5 中存在/曾经存在一个错误,导致在 EOS 沿着管道传播之前最后一个缓冲区没有被推送到输出板。
TLDR:将
self._appsrc.send_event(Gst.Event.new_eos())
替换为 self._appsrc.end_of_stream()
.