ffmpeg输出x264的CBR流或者文件
2018-01-29 16:13
1696 查看
CBR(Constant Bit Rate)是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。这种算法优先考虑码率(带宽)。
这个算法也算是码率控制最难的算法了,因为无法确定何时有motion发生,假设在码率统计窗口的最后一帧发生motion,就会导致该帧size变大,从而导致统计的码率大于预设的码率,也就是说每秒统计一次码率是不合理的,应该是统计一段时间内的平均码率,这样会更合理一些。
VBR(Variable Bit Rate)动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。
参考自:http://blog.csdn.net/szfhy/article/details/50820119
由于项目中,不允许出现波动较大的流,所以VBR不适合。
在网上也有找一些关于CBR的编码参数,有些参数确实可以很好的控制媒体流的码率,但是质量影响太大了。所以我需要一组参数,介于CBR与VBR之前。即码率可以允许波动,但不要波动太大。
固定码率
ffmpeg -i orig.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 250k -an -movflags rtphint -bf 0 test.mkv
用bitrate工具分析test.mkv的码率,波动很小,如图:
其中,bufsize的大小等于bitrate / framerate。(但不清楚为什么bitrate分析出来的码率值与转码参数中的值有些出入)。可以看出,加入码率控制相关的参数,ffmpeg确实可以很好的控制输出文件的码率。但质量影响很大。再看Elecard工具分析的截图:
从各帧的大小来看,I帧码率与P帧差不多,可以想象,I帧的质量会有多差。播放效果也指明,在场景切换的时候,质量会很差,然后又会好起来。
所以,这种CBR的参数并不实用。
介于CBR与VBR之间
ffmpeg -i orig.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 500k -an -movflags rtphint -bf 0 test.mkv
跟上一组参数比较,bufsize放大了一倍,其它参数不变,然后再用bitrate工具分析其码率,如图:
码率出现了一些波动,但波动范围很小。再看看elecard工具分析的截图:
I帧的码率上去了,图像质量也有明显的提升。
简单总结:想要输出CBR,bufsize参数很重要(具体多少合适,应该根据使用场景来确定,但网上给的公式:bufsize = bitrate / framerate肯定不合适),否则影响画面质量。
这个算法也算是码率控制最难的算法了,因为无法确定何时有motion发生,假设在码率统计窗口的最后一帧发生motion,就会导致该帧size变大,从而导致统计的码率大于预设的码率,也就是说每秒统计一次码率是不合理的,应该是统计一段时间内的平均码率,这样会更合理一些。
VBR(Variable Bit Rate)动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。
参考自:http://blog.csdn.net/szfhy/article/details/50820119
由于项目中,不允许出现波动较大的流,所以VBR不适合。
在网上也有找一些关于CBR的编码参数,有些参数确实可以很好的控制媒体流的码率,但是质量影响太大了。所以我需要一组参数,介于CBR与VBR之前。即码率可以允许波动,但不要波动太大。
固定码率
ffmpeg -i orig.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 250k -an -movflags rtphint -bf 0 test.mkv
用bitrate工具分析test.mkv的码率,波动很小,如图:
其中,bufsize的大小等于bitrate / framerate。(但不清楚为什么bitrate分析出来的码率值与转码参数中的值有些出入)。可以看出,加入码率控制相关的参数,ffmpeg确实可以很好的控制输出文件的码率。但质量影响很大。再看Elecard工具分析的截图:
从各帧的大小来看,I帧码率与P帧差不多,可以想象,I帧的质量会有多差。播放效果也指明,在场景切换的时候,质量会很差,然后又会好起来。
所以,这种CBR的参数并不实用。
介于CBR与VBR之间
ffmpeg -i orig.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 500k -an -movflags rtphint -bf 0 test.mkv
跟上一组参数比较,bufsize放大了一倍,其它参数不变,然后再用bitrate工具分析其码率,如图:
码率出现了一些波动,但波动范围很小。再看看elecard工具分析的截图:
I帧的码率上去了,图像质量也有明显的提升。
简单总结:想要输出CBR,bufsize参数很重要(具体多少合适,应该根据使用场景来确定,但网上给的公式:bufsize = bitrate / framerate肯定不合适),否则影响画面质量。
相关文章推荐
- linux、shell脚本实例一“查找一个文件或者目录 找到了提示 没找到则输出未找到”
- iOS 开发 Pch 文件的正确使用1.存放一些全局的宏(整个项目中都用得上的宏) 2.用来包含一些全部的头文件(整个项目中都用得上的头文件) 3.能自动打开或者关闭日志输出功能
- C#运行批处理或者bat文件并且得到输出
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- [学习笔记]基于ffmpeg的视频解码,输出YUV图像到文件。
- 04 ffmpeg 从媒体文件解封装,输出YUV420图像
- Hadoop 实例16-----MultipleOutputs实战:结果输出到多个文件夹或者文件中
- ffmpeg 2.3 blend视频叠加输出文件时间长度问题
- 将报表不在本地生成文件,直接输出到浏览器或者另存为的方法
- 关于Tomcat调用FFmpeg进行切片转码输出文件权限不足的问题-----终于得到解决!!!
- 【转】ffmpeg解码含有B帧的视频文件的输出顺序
- 基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)
- 基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)
- 使用idea时候遇到的一些输出文件或者读取文件路径问题
- maven项目图标带红色感叹号(红灯、红点、红线)且保存时无法自动编译(无法生成class文件,提示Error: Could not find or load main class,或者代码改动后输出
- C#运行批处理或者bat文件并且得到输出
- ffmpeg 输出日志到文件
- x264输出文件的后缀名可设为哪些?详细报告
- 基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)
- ffmpeg将一个视频文件解码输出bmp和jpg文件--重写tutorial01程序