【问题标题】:x264 / libx264 : Can only one I/P frame to be used as reference for B-frames?x264 / libx264 : 只能将一个 I/P 帧用作 B 帧的参考吗?
【发布时间】:2021-08-16 22:59:49
【问题描述】:

如你所知ref参数可以设置每个P帧可以用作参考的先前帧数。

B 帧我需要同样的东西,但 ref=1 不适用于 B 帧。

我的意思是 I/P 帧仅用作 B 帧的参考。

是否可以使用命令行? ,或者通过更改源代码中的以下函数?

static inline int reference_update( x264_t *h )
{
if( !h->fdec->b_kept_as_ref )
{
    if( h->i_thread_frames > 1 )
    {
        x264_frame_push_unused( h, h->fdec );
        h->fdec = x264_frame_pop_unused( h, 1 );
        if( !h->fdec )
            return -1;
    }
    return 0;
}

/* apply mmco from previous frame. */
for( int i = 0; i < h->sh.i_mmco_command_count; i++ )
    for( int j = 0; h->frames.reference[j]; j++ )
        if( h->frames.reference[j]->i_poc == h->sh.mmco[i].i_poc )
            x264_frame_push_unused( h, x264_frame_shift( &h->frames.reference[j] ) );

/* move frame in the buffer */
x264_frame_push( h->frames.reference, h->fdec );
if( h->frames.reference[h->sps->i_num_ref_frames] )
    x264_frame_push_unused( h, x264_frame_shift( h->frames.reference ) );
h->fdec = x264_frame_pop_unused( h, 1 );
if( !h->fdec )
    return -1;
return 0;
}

【问题讨论】:

    标签: video ffmpeg h.264 x264 libx264


    【解决方案1】:

    没有。 B 帧根据定义是双向的,即它必须至少有 2 个参考帧(按呈现顺序,一个在前,一个在后),否则它根本没有意义,并且与 P 帧没有区别。

    【讨论】:

    • 在 I 帧(不是 IDR)剪切后的开放 GOP 流中,您可以按解码器顺序获得 IBBPBB,按呈现顺序获得 BBIBBP,但在这种情况下,如果从它开始解码,前 2 个 B 帧应该被丢弃。
    • 这样的流可以在剪切之后再进行一次,但是这个 B 帧是不可解码的(没有伪影和错误隐藏)。 x264 还可以使用 --open-gop 选项对 open-GOP 进行编码。向我展示任何可以以其他方式对其进行编码的商业编码器,并流式传输该 B 帧可以正确解码的样本。
    • 他们不能,是你说有可能的。他们最多能做的就是像我说的编码 open-gop 并切割第一个 GOP,即像这个用 x264 编码的样本:test.zipmirror
    • 是的。我看着它。它确实使用 I(DR)BBPBBP 模式。之后我重新阅读了 H.264 规范并发现它在 8.2.4.2.3 Initialization process for reference picture lists for B slices in frames 中说:When this process is invoked, there shall be at least one reference entry that is currently marked as "used for reference" (i.e., as "used for short-term reference" or "used for long-term reference") and is not marked as "non-existing". 所以看起来确实可以为 RefPicList0 和 RefPicList1 使用相同的参考框架。
    • 但是从压缩效率的角度来看,我不明白这种B帧的意义。恕我直言,唯一的用途是在第一个 GOP 和下一个 GOP 中保持相同的非自适应开放式帧模式。
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 2015-03-31
    • 2013-10-27
    • 2017-02-19
    • 2021-05-06
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多