【问题标题】:Flush delayed frames every a few input frames in x264在 x264 中每隔几个输入帧刷新延迟帧
【发布时间】:2014-05-14 23:56:04
【问题描述】:

您好,我是 x264 的新手,了解一些基础知识。 x264 cli(x264.c)中使用的编码API例程总结为:

  1. 致电x264_encoder_open并设置参数。
  2. 从输入视频中提取一帧并使用x264_encoder_encode对其进行编码。
  3. 迭代 2。直到输入 EOF 或达到给定的帧限制。
  4. 刷新延迟的帧。

我的问题是:除了在编码过程结束时仅刷新一次 x264 编码器之外,是否可以在第 2 步中刷新延迟的帧?例如,我想每隔 20 帧(或一个 GOP 帧)手动刷新编码器,输入x264_encoder_encode 并在所有延迟帧都编码后恢复正常过程。因此,视频将有几个刷新程序。

问候

【问题讨论】:

    标签: h.264 x264


    【解决方案1】:

    不,这是不可能的。一旦您将第一个 NULL 帧发送到 x264_encoder_encode 以刷新帧,它将停止所有工作线程进行编码,因此您需要调用 x264_encoder_close/x264_encoder_open 来启动新的编码实例。顺便说一句,为什么您需要每 20 帧刷新一次帧?因为我无法理解这样的用例。

    【讨论】:

    • 我想让 x264 API 的调用者知道是否已经编码了许多帧,我认为刷新帧是一种方法。你能用另一种方式命名吗?也许检查输出最终数据包的ID?
    • 如果您只想知道已经编码的帧数,您可以简单地计算 x264_encoder_encode 返回 >0 结果的次数。如果您想知道某些特定帧(重新排序后)是否已经编码,您可以检查 pic_out 的 i_pts。
    • 谢谢!我还有两个问题: 1. x264_encoder_encode 是异步函数吗,即 x264_encoder_encode 返回后仍有 x264 线程在做编码工作? 2.如果ret值>0,x264_encoder_encode每次输出一个编码帧吗?
    • 1.是的,如果 x264 配置为使用超过 1 个线程(默认情况下,如果您没有将其显式设置为 1)并且不使用切片线程。但是不会为此使用术语异步(对我而言,异步意味着我们不知道操作何时完成并有回调来发出信号),因为 x264_encoder_encode 本身是同步的,但实际的编码工作可以与其他工作并行完成。 2. 是的,单个 x264_encoder_encode 仅输出单个编码帧(或开始时无帧)。返回值 0 帧编码(所有 NAL 的大小)
    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多