我们在视频会议项目中使用x264编码器,我们具有基本的流视频功能,但是,在理解各种速率控制设置如何确定最终比特率时遇到了麻烦。
我们设置以下参数:

x264_param_t params;
x264_param_default_preset(&params, "ultrafast", "zerolatency");
params.i_threads = 1;
params.i_width = width;
params.i_height = height;
params.i_fps_num = fps;
params.i_keyint_max = fps;
params.b_intra_refresh = 1;
params.b_repeat_headers = 1;
params.b_annexb = 1;

//Set rate control stuff here

x264_param_apply_profile(&params, "baseline");


如果仅设置params.rc.i_bitrate参数,则编码器似乎会严重超出比特率。如果我们设置i_vbv_max_bitrate和i_vbv_buffer_size参数,我们将看到一个比特率达到i_vbv_max_bitrate设置的峰值(有时过冲)。显然,严格控制比特币对视频会议很重要,但是文档是不透明的。还有其他人使用x264进行视频会议吗?您如何设置编码器?任何帮助表示赞赏,在此先感谢。

最佳答案

如果您处于低延迟视频会议模式下以实现最小的抖动和可靠的性能,则需要处于CBR模式而不是VBR模式。 VBR模式可提供实时低延迟系统无法处理的起伏和峰值。

对于低延迟视频通信/监视应用程序,有专门的vbr算法,但是x264没有。因此,请勿使用其vbr。它的vbr用于存储。

有一个--nal-hrd cbr来启用cbr

由于事情是统计的,因此您无法保证比特率不会超出某个点。但是,只要满足某些假设,您就可以在99%的时间内将其控制在可控范围内。

从质量角度来看,您的vbv缓冲区大小必须是可以处理的最小大小,有两个目的
1.不允许比特率变化太大
2.减少端到端延迟
这是编码器假定在解码器侧可用的缓冲。越小质量越差。找到您可以处理的最小值。

必须将vbv最大比特率设置为cbr目标比特率值。这是rc的准则,即这是允许的最大瞬时比特率。将其设置为目标比特率。记住它的准则。由于视频的统计性质,它可能会过高。

确保进行帧内刷新,因此I图片已关闭。

如果不覆盖某些设置,使用“超快速”可能不是一个好的预设。显式设置参考图片,b图片,配置文件。
将您和我的子级别设置为更高的级别。 [如果我是你,那是最高的水平]。这是您被枪杀的原因之一。因此,编码器无法做好工作。当编码器对我和我有更好的要求时,它需要较少的位来编码发生爆炸的坚硬部分!通常,不懂视频的人不会得到这个。他们一直在问为什么我/子对象对比特率和突发事件很重要。相信我。当困难的部分用于编码时,您获得的拍摄量完全取决于编码器的算法,而我是关键的算法之一。

查看您需要使用的配置文件。 Cabac最多可提高20%。因此,如果您可以做主要的个人资料,那就去做。仅使用1张参考图片,而不使用B张图片。但是,如果可以使用cabac来获得比特率优势,绝对没有害处。

编辑:
通常,没有魔术药。以上是从多年从事多媒体和理解视频中获得的建议。但是,您仍然需要进行一些尝试才能在质量/延迟和系统特定的其他约束之间找到最佳设置。在对术语进行调整之前,请确保您理解这些术语,否则您将永远绕圈子。还记得视频是统计的。没有任何事情会永远都是完美的100%。

关于video-streaming - x264速率控制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12221569/

10-09 15:35