gstreamer - 如何等待 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
都写入输出视频文件。
解决方案
实际上,您必须等待该 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>
推荐阅读
- excel - 在 VBA 中用 Edge 替换 IE 位
- monitoring - 使用通配符的流入计数器聚合
- java - Spring Initializr gradle 项目失败未知属性'compileConfigurationName'
- javascript - 带有向上和向下箭头的 ngb 时间选择器问题
- r - 删除R中组之间的重复项
- conda - 如何像 conda 一样使用 pyenv?
- automation - 空手道 UI 自动化:能够切换页面但无法识别该新页面上的元素
- python-3.x - 为什么我的 .wsgi 文件会出现内部服务器错误?
- vue.js - Axios 没有在标头中发送 cookie,即使使用 withCredentials: true | 后端 FastAPI
- sql - 使用 goose 进行迁移版本控制的问题