Video x264/libx264:只能将一个I/P帧用作B帧的引用吗?

Video x264/libx264:只能将一个I/P帧用作B帧的引用吗?,video,ffmpeg,h.264,x264,libx264,Video,Ffmpeg,H.264,X264,Libx264,正如您所知,ref参数可以设置每个p帧可以用作参考的前一帧的数量 对于B帧我需要同样的东西,但是ref=1不适用于B帧 我是指仅用作B帧参考的I/p帧 可以使用命令行吗,还是通过在源代码中更改以下函数 static inline int reference_update( x264_t *h ) { if( !h->fdec->b_kept_as_ref ) { if( h->i_thread_frames > 1 ) { x264_fra

正如您所知,
ref
参数可以设置每个p帧可以用作参考的前一帧的数量

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

我是指仅用作B帧参考的I/p帧

可以使用命令行吗,还是通过在源代码中更改以下函数

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;
}
static inline int reference\u更新(x264\u t*h)
{
如果(!h->fdec->b_作为参考)
{
如果(h->i_线程\u帧>1)
{
x264帧推送未使用(h,h->fdec);
h->fdec=x264_帧_弹出_未使用(h,1);
如果(!h->fdec)
返回-1;
}
返回0;
}
/*应用上一帧中的mmco*/
对于(int i=0;ish.i\u mmco\u命令\u计数;i++)
对于(intj=0;h->frames.reference[j];j++)
if(h->frames.reference[j]->i_-poc==h->sh.mmco[i].i_-poc)
x264帧推送未使用(h,x264帧移位(&h->frames.reference[j]);
/*在缓冲区中移动帧*/
x264帧推送(h->frames.reference,h->fdec);
如果(h->frames.reference[h->sps->i\u num\u ref\u frames])
x264帧推送未使用(h,x264帧移位(h->frames.reference));
h->fdec=x264_帧_弹出_未使用(h,1);
如果(!h->fdec)
返回-1;
返回0;
}

否。根据定义,B帧是双向的,即它必须至少有2个参考帧(一个在显示顺序之前,一个在显示顺序之后),否则它毫无意义,也不会与p帧有所不同。

在i帧(非IDR)切割后的开放GOP流中您可以按解码器顺序获得IBBPBB,按表示顺序获得BBIBBP,但在这种情况下,如果解码从它开始,则应丢弃前2个B帧。可以在剪切后再剪切一次此类流,但此B帧不可解码(无伪影和错误隐藏)。x264还可以使用
--open GOP
选项对open GOP进行编码。告诉我任何商业编码器,它可以编码其他方式和流样本,这B帧将正确解码。他们不能,是你说这是可能的。他们最多能做的就是像我说的编码开放的gop和切割第一个gop,也就是说,像这个用x264编码的样本:或者是。我看了看。它确实使用I(DR)BBPBBP模式。之后,我重新阅读了H.264规范,发现它在
8.2.4.2.3帧中B切片参考图片列表的初始化过程中说:
调用此过程时,应至少有一个参考条目当前标记为“用于参考”(即“用于短期参考”)或“用于长期参考”),且未标记为“不存在”“
因此,看起来RefPicList0和RefPicList1都可以使用相同的参考帧。但从压缩效率的角度来看,我不理解这种B帧的意义。唯一的用途是在第一个gop和下一个gop中保持相同的非自适应开放gop帧模式。