ffmpeg CBR精准码流控制三个步骤

简介: ffmpeg CBR精准码流控制三个步骤

thxchtb3wcn3k_d11fc1ff3db9431d8ad7575e9297ae48.png


x264可以设置VBR和CBR的编码模式,VBR为可变码率,CBR为恒定码率。尽管互联网上VBR居多,但是CBR依然存在。

ffmpeg是通过-b:v来指定视频码率,但这个设定的是平均值,并不能够很好的控制上下波动幅度。如果要控制波动,还需要控制最大码率和最小码率,即-b:v,maxrate,minrate。同时为了更好的控制编码时的波动还可以设置编码时的buffer大小,即设置-bufsize即可。buffer的设置并不是越小越好,而是恰到好处,如1Mbit/s,bufsize设置为50KB,可以很好的控制码率波动。

ffmpeg  -i  input.mp4  -c:v  libx264  -x264opts  "bframes=10:b-adapt=0"   -b:v
1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0
output.ts


下面就来分析一下这条命令行,具体如下。

● 设置B帧的个数,并且是每两个P帧之间包含10个B帧

● 设置视频码率为1000kbit/s

● 设置最大码率为1000kbit/s

● 设置最小码率为1000kbit/s

● 设置编码的buffer大小为50KB

● 设置H.264的编码HRD信号形式为CBR

● 设置每50帧一个GOP

● 设置场景切换不强行插入关键帧

根据上述参数设置之后生成的output.ts文件,使用Bitrate Viewer观察其码率波动效果,结果如图4-6所示。


从图中可以看到码率波动为最小996kbit/s,最大码率为1001kbit/s,码率得到了控制


4f989c5182b8459eb4459f3be4927e26.jpg


补充关于B帧:


如果不希望出现B帧,多用B帧才能使得h264真正压缩率达到200,I帧压缩率最低,P帧中等,B帧最高,因此B帧也会增加编码器负载,但可以减少码率。与不用相比,多用B帧时,同样的码率视频更清晰。


补充:

ABR是VBR和CBR的混合方案,VBR一般用于媒体存储,而不是网络传输,其实网络传输所谓的CBR一般都是ABR,只要单位时间内把码率控制住就可以了。ABR编码在速度上是VBR编码的2到3倍,但低于CBR。

CBR编码的缺点在于质量不稳定,当有运动产生时,质量会下降,尤其是设置的码率较低时更明显。

VBR的优势是当内容简单时,分配的码率就少,当视频复杂时就多分配点码率,因此在相同文件大小时,VBR的视频质量要好于CBR。当两者质量相同时,VBR大小可能只是CBR的一半。


h264编码的帧由大到小依次为:

I > P > B

(互相之间约有5倍的差距)

x264的编码耗时由长到短依次为:

P > B > I

通常而言,较小的帧因为帧内压缩计算量(deblock、cabac等)小,所以耗时相对短。

P帧的编码耗时长是因为帧间压缩(宏块寻找、运动补偿等)耗时长所以提高了总体耗时。


相关文章
|
2月前
|
存储 编解码
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
《FFmpeg开发实战》书中介绍了音视频编码历史,重点讲述H.264的成功在于其分为视频编码层和网络抽象层。H.264帧类型包括SPS(序列参数集,含视频规格参数),PPS(图像参数集,含编码参数)和IDR帧(立即解码刷新,关键帧)。SPS用于计算视频宽高和帧率,PPS存储编码设置,IDR帧则标志新的解码序列。书中还配以图片展示各帧结构详情,完整内容可参考相关书籍。
98 7
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
|
编解码 并行计算 Linux
LINUX下,ffmpeg增加NVIDIA硬件编解码的步骤及解决办法
LINUX下,ffmpeg增加NVIDIA硬件编解码的步骤及解决办法
599 0
|
编解码 缓存 开发工具
【FFMpeg视频开发与应用基础】三、调用FFmpeg SDK对H.264格式的视频压缩码流进行解码
《FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK》视频教程已经在“CSDN学院”上线,视频中包含了从0开始逐行代码实现FFMpeg视频开发的过程,欢迎观看!链接地址:FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK 工程代码地址:FFmpeg_Tutorial 经过了上篇调用FFMpeg SDK对视频进行编码的过程之后,我们可以比较容易地理解本篇的内容,即上一篇的逆过程——将H.264格式的裸码流解码为像素格式的图像信息。
2307 0
|
C语言
FFMPEG 库移植到 VC 需要的步骤
在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷贝到工程中就行了,还需要做以下几步。(此方法适用于自己使用MinGW编译的库,也同样适用于从网上下载的编译好的库,例如http://ffmpeg.zeranoe.com/builds/)。
935 0
|
开发工具 C++
ffmpeg基础与编译_在VS2008下调试output_example.c(详细步骤)
注意:这个是编译Debug版本的。必要资源:FFMPEG SDK 3.2(已经编译好的,可以去http://www.bairuitech.com/html/ruanjianxiazai/ffmpeg/20080414/89.html下载)1.建立一个空的VC++工程  建立好之后,将FFMPEG SDK 3.2下的output_example.c文件拷贝至路径“%Project Dir%/%Project Name%/”下  其“%Project Dir%”为你所建立的工程的路径,“%Project Name%”为工程名。
1079 0
|
2天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
12 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
3天前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
11 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo