FFMPEG设置 cbr讨论

Q:我采用ffmpeg调用x264一直出错,命令如下
ffmpeg -s 352x288 -r 50 -pix_fmt yuv420p -i tmp.yuv tmp.h264
可不可以给点建议,找了很久也没有找到解决办法,错误时error while opening encoder for output stream 0.0 maybe incorrect parameters,先谢了

A-vcodec libx264 没加?

加了也是一样

你把 x264编进去没

ffmpeg -s 176x144 -pix_fmt yuv420p -r 30 -b 200000 -i foreman_part_qcif.yuv -vcodec libx264 new1.h264

-qmin 10 -qmax 51 -qdiff 4 -me_range 16 -keyint_min 25 -qcomp 0.6

boradcasting 或者 streaming 的应用,CBR都首要优先满足的条件
现在那些高清电视台为什么要使用占用几十兆的资源的mpeg2 ts流来播放,一个主要原因就是因为h.264没有真正cbr,而mpeg2就有
streaming 应用其实也能处理一定程度的VBR,但是在某些时候,为了处理VBR码流的不稳定带来的开销远远超过它带来的好处,不如用CBR,甚至多花几倍的存储和带宽都无所谓
一直很困惑,CBR这种在boradcasting 和 streaming的大型工业级的应用上非常重要的东西,h.264是怎么考虑的

1、VBR 适合的应用场景是媒体存储,而不是网络传输,因此不要让武状元去当文官;
2、其实实际网络传输中所谓的 CBR 一般都是 ABR(平均比特率),即只要是单位时间内把码率控制在额定码率就可以了,因为编码输出本来就有缓冲可以起到平滑波动的作用;
3、你所谓的严格意义上的 CBR 是每一帧都分配同样的码字,试想一下,如果某一帧所需要的码字本来就很少,而你却一定要给它分配很多码字,那不是浪费么?另一方面,如果某一帧所需要的码字本来就多,而你却给得很少,那这帧的效果会很差。这样编下来,整体序列质量会忽好忽坏地不停发生跳变,反而对视觉冲击很大;因此 ABR 才是最适合网络传输的方案;
4、无论是 CBR、ABR 还是 VBR 都是属于码率控制,而码率控制是视频编码的开放部分,它不会改变码流结构的合法性,因此无论在 MPEG2、MPEG4 还是 H.263、H.264 当中都没有做规定;
5、由于目前的视频编码标准都是基于块编码的混合编码框架,因此一个码率控制算法可以用到任何协议上(当然有时候需要做点小的改动),只不过是控制效果好不好的问题,没有哪个 RC 是专属哪个协议的。

楼主的需求就是一种非常硬性的CBR码率控制解决方案,这种解决方案要做到每一个帧的输出比特几乎相同(或误差相当小,甚至小到可以忽略不计)。上面诸多同仁的讨论中已经指出,通过插入(无效的)比特来填充帧编码的比特是一种合理的解决方案,我也认为这可能是必要的一种解决方法了。

我是这样考虑这个问题的:

其一:如果不计编码次数,我们可以对确定的一帧枚举若干给定QP值的编码结果,然后选取不超过但最接近目标比特率的帧编码QP,再填充无效比特;也可以在选择出QP值的基础上,做宏块级枚举QP,微调QP值,以达到更接近目标比特率。这样的一种解决方案想来没有人会喜欢,因为反复编码次数太多,效率太低。但是这种方法可以近最大可能地保留有效比特。

其二:按照楼主的这个需求和您给出的图示,我发现您的应用在1280X534,甚至是1080p。目标比特率以Mkbps为单位,在24Hz和30Hz,在高清画质上做编码。我的经验是,如果给定的比特率足够高,即将此问题放在中高带宽下的码率控制的讨论中,则楼主的问题才具有现实的意义。因为中高比特率下的码率控制要比中低比特率下的好控制的多。

我对这个问题非常感兴趣,若有空闲希望做进一步的深入。稍早些时候我也考虑过这个问题,但是限于知识面太窄,不清楚具体是否有价值作这个问题。楼主在讨论中给出的应用需求和相关背景非常具有参考意义。

我希望给楼主请教一个问题:我看到你给出的图是用bitrate viewer 这个应用程序作图。以前我没有见过,效果还挺好。我想问,这个应用程序是您自己写的还是哪里可以提供的呢?

今晚太困,话不成句,若有闲暇,后作修订。

你可能感兴趣的:(ffmpeg)