『漫游』酷论坛>『影音数码技术学习交流』>vbv_bufsize 究竟应该怎 ..
vbv_bufsize 究竟应该怎么计算?
洋芋环@2009-07-11 16:15
想编码成接近CBR状态,给播放机用
vbv-maxrate 选择的3200kbps
vbv_bufsize 究竟应该怎么计算呢? 假设播放机有6MB的缓存
ssnake@2009-07-11 16:39
要CBR的话,--qcomp 0。
你这个假设没有意义。
洋芋环@2009-07-11 17:12
引用
最初由 ssnake 发布
要CBR的话,--qcomp 0。
你这个假设没有意义。
--qcomp 0 已经设置了,主要想搞明白vbv_bufsize究竟是什么意义:是指波动范围?
测试了vbv_bufsize分别为1、300、3100的情况,vbv_bufsize为300的时候,码率波动最小
要消除VBV underflow,只有增加 vbv_bufsize
但是VBV underflow 的告警,是否会影响到网络播放机的解码呢?
------------------------------------------------------------------------
测试过程:
故意选取了一段码流差异极大的片段做测试,时间1分钟,2pass,vbv_maxrate 3100k
当vbv_bufsize 设置为1时候,出现以下 underflow
此时最大码流3373k,文件大小13321k
======================================
J:\mctemp4040.aac is scheduled to be muxed into container as type 1.
x264 [warning]: VBV underflow (-12192 bits)
x264 [warning]: VBV underflow (-28800 bits)
x264 [warning]: VBV underflow (-34585 bits)
x264 [warning]: VBV underflow (-38704 bits)
x264 [warning]: VBV underflow (-1081 bits)
x264 [warning]: VBV underflow (-52680 bits)
x264 [warning]: VBV underflow (-193768 bits)
x264 [warning]: VBV underflow (-33088 bits)
x264 [warning]: VBV underflow (-41488 bits)
x264 [warning]: VBV underflow (-48976 bits)
x264 [warning]: VBV underflow (-30440 bits)
x264 [warning]: VBV underflow (-54256 bits)
Flushing video frames.
Video stream: 264909.637 kbit/s (33113704 B/s) size: 1490227200 bytes 45.003 secs 1079 frames
x264 [warning]: VBV underflow (-31907 bits)
x264 [warning]: VBV underflow (-120936 bits)
x264 [warning]: VBV underflow (-68816 bits)
x264 [warning]: VBV underflow (-63864 bits)
x264 [warning]: VBV underflow (-82792 bits)
x264 [warning]: VBV underflow (-72528 bits)
x264 [warning]: VBV underflow (-128 bits)
x264 [warning]: VBV underflow (-146296 bits)
x264 [warning]: VBV underflow (-6241 bits)
J:\mctemp4040.264 is scheduled to be muxed into container as type 2.
======================================
看它最大值没超过300,于是把vbv_bufsize设置为300,underflow减少了,但仍然存在
此时最大码流3337k,文件大小13413k
======================================
J:\mctemp4040.aac is scheduled to be muxed into container as type 1.
x264 [warning]: VBV underflow (-43536 bits)
x264 [warning]: VBV underflow (-11584 bits)
x264 [warning]: VBV underflow (-115784 bits)
x264 [warning]: VBV underflow (-54360 bits)
x264 [warning]: VBV underflow (-66760 bits)
x264 [warning]: VBV underflow (-68896 bits)
x264 [warning]: VBV underflow (-83448 bits)
x264 [warning]: VBV underflow (-38736 bits)
x264 [warning]: VBV underflow (-48848 bits)
Flushing video frames.
Video stream: 264909.637 kbit/s (33113704 B/s) size: 1490227200 bytes 45.003 secs 1079 frames
x264 [warning]: VBV underflow (-27819 bits)
x264 [warning]: VBV underflow (-155890 bits)
x264 [warning]: VBV underflow (-68296 bits)
x264 [warning]: VBV underflow (-63816 bits)
x264 [warning]: VBV underflow (-83712 bits)
x264 [warning]: VBV underflow (-89681 bits)
x264 [warning]: VBV underflow (-7928 bits)
======================================
于是把vbv_bufsize设置为和vbv_maxrate相同的3100,underflow告警消失了
此时最大码流4160k,文件大小14061k
roozhou@2009-07-13 10:19
码率的计算永远都是“平均的”,需要一定大小的取样窗口
vbv_bufsize就是这个窗口的大小,设为5000,就表示在编码出的视频中任取一段大小为5M的连续片段,它的平均码率都不能超过你的预设值即vbv_maxrate
所以你的播放器有多大的缓存,你就把vbv_bufsize设为多大
ki。曲奇@2009-07-13 16:23
那若果在PC上放, 比如DVDrip
vbv_bufsize跟vbv_maxrate一般都是設0?
ssnake@2009-07-13 16:30
引用
最初由 ki。曲奇 发布
那若果在PC上放, 比如DVDrip
vbv_bufsize跟vbv_maxrate一般都是設0?
DVDRIP码率不太可能上到让你机器解不动,所以但设0无妨。。
洋芋环@2009-07-13 23:31
引用
最初由 roozhou 发布
码率的计算永远都是“平均的”,需要一定大小的取样窗口
vbv_bufsize就是这个窗口的大小,设为5000,就表示在编码出的视频中任取一段大小为5M的连续片段,它的平均码率都不能超过你的预设值即vbv_maxrate
所以你的播放器有多大的缓存,你就把vbv_bufsize设为多大
这个应该是指单位时间内的波动幅度吧
洋芋环@2009-07-13 23:32
引用
最初由 ki。曲奇 发布
那若果在PC上放, 比如DVDrip
vbv_bufsize跟vbv_maxrate一般都是設0?
设置为0即为VBR
PC上播放VBR最合适
vbv_bufsize对PC没什么意义
洋芋环@2009-07-13 23:33
测试了两天,最终结果是确定吧vbv_bufsize设置为1了
告警就不管它了
a4840639@2009-07-14 00:36
听了解释以后我还是觉得这个东西很有问题
播放器对码率的限制到底是指的严格意义上每一秒的数据量还是buffer里头的平均码率?
播放器有多少buffer又怎么能知道?
roozhou@2009-07-14 01:41
引用
最初由 a4840639 发布
听了解释以后我还是觉得这个东西很有问题
播放器对码率的限制到底是指的严格意义上每一秒的数据量还是buffer里头的平均码率?
播放器有多少buffer又怎么能知道?
我前面解释的很清楚了,解码的过程是连续的,并存在“每一秒”这种说法,因为1秒~2秒,1.1秒~2.1秒,1.11秒到2.11秒,这些都是“每一秒”。如果你仅仅保证1~2秒,2~3秒的码率不超是没用的,因为可能1.5~2.5秒的码率超了。
你可以把播放器的缓冲区看成一根管子,你不断地从一头塞重量不同但体积相同的东西进去(如果视频是vfr那么体积也不相同),塞满后东西会从另一头掉出来。管子的承重能力是有限的,所以你需要保证任何时刻管子里所有东西的重量都不能超过这个限制。
洋芋环@2009-07-14 12:55
引用
最初由 a4840639 发布
听了解释以后我还是觉得这个东西很有问题
播放器对码率的限制到底是指的严格意义上每一秒的数据量还是buffer里头的平均码率?
播放器有多少buffer又怎么能知道?
按照现在的理解,vbv_bufsize应该是指单位时间内以vbv-maxrate为基准的波动范围
--qcomp = 0,假设vbv-maxrate设置为3000kbps,vbv_bufsize设置为300kb,意思是在任何一秒内平均码流不超过3300
网络播放要求尽可能的接近3000kpbs的恒定码流,设置vbv_bufsize又会引起码流波动更大
实在搞不懂这个参数的意义了
roozhou@2009-07-14 13:37
vbv_bufsize的单位是kb不是kbps
洋芋环@2009-07-14 15:39
引用
最初由 roozhou 发布
vbv_bufsize的单位是kb不是kbps
是的,已经把上面的修改了,虽然它的单位为kp,其实仍然隐含了时间的,不然就没意义了
现在的理解又近了一步:
虽然vbv_bufsize是一个ratecontrol的参数,但它真正的目的是质量:在已知硬解码器buffer大小的前提下,设置码流波动幅度上限,以获得更好质量
但结果是使得编码以后的文件更加VBR化,这恰好和网络播放中大量并发流要求的尽量CBR又是矛盾的
软件解码器不需要这个参数,所以当设置为0时候,仍然是以max rate为基准的vbr
vbv_bufsize仅用在硬解码器上,这是指硬解码器有需求的时候。对于网络播放所用的硬解码器,为了实时控制的考虑,解码器的buffer大小通常没有意义(因为都足够大),太大的缓存反而会影响实时控制
对于播放机播放本地文件所使用的硬解码器,考虑buffer基本也是毫无意义的,因为作为播放机解决缓存大小和控制问题几乎不费吹灰之力
所以vbv_bufsize这个参数用在假设的那个硬解码器的buffer上是基本是无意义的,它的本质就是vbr, 和qcomp的作用类似
h.264没有真正的CBR模式,这是它的一大软肋,并且自身没有码流下限控制(低码流时的码流填充),只有上限设置
现在所测试到最接近CBR的设置为:qcomp=0, vbv_bufsize=1, 2pass
以上理解欢迎高手指导
roozhou@2009-07-14 15:47
网络播放为什么要设置下限?
设置上限的作用是减少缓冲时间,保证网速有限的情况下能连续播放
硬解同样有码率限制,实际限制的是单帧的大小,但并不需要你手动设置vbv_maxrate和vbv_bufsize
| TOP