mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在google上search了一下,这方面的介绍为0,那就找mediaxyz请教请教吧,这些可都是经验,非常宝贵!

以下是与mediaxyz在QQ上聊天的记录,只有一部分,因为QQ把之前的谈话删除了,但基本上精髓都可这里了。

mediaxyz 23:40:26
你说的qsable是c->global_quality吧
Leon 23:40:44
br值的设定规则,是100kbps 就为 100*1024 吧?
mediaxyz 23:41:07
yes
mediaxyz 23:41:26
你有没有发现,ffmpeg是100*1000
mediaxyz 23:41:37
并不是100*1024
Leon 23:41:28
是的,
Leon 23:42:13
我看到有这样一句话:
   qscale 以<数值>质量为基础的VBR,取值0.01-255,越小质量越好

mediaxyz 23:42:30
而且在后面的处理中还是/1000
mediaxyz 23:42:43
是的
mediaxyz 23:42:51
越小质量越好,码率越大
Leon 23:42:55
那0.01-255范围也太大了吧!
mediaxyz 23:43:29
这是为了精细控制,实际上没必要
mediaxyz 23:43:42
我测试0。01-50就可以了
mediaxyz 23:43:52
再大图像很糟糕
Leon 23:43:55
global_quality有什么作用?
mediaxyz 23:44:18
反正老外总是想的很周到
mediaxyz 23:44:35
global_quality你说的 <数值>质量
Leon 23:44:36
就是我说的qscale值?
mediaxyz 23:45:01
是的
Leon 23:45:01
这个值能不能动态的调整?
mediaxyz 23:45:56
我没有试过
mediaxyz 23:46:07
按照ffmpeg的调用规则,好像不行
Leon 23:46:32
按照你的说话,VBR设定如下几个值就可以了:
c->flags |= CODEC_FLAG_QSCALE;
c->rc_min_rate =min;
c->rc_max_rate = max;
c->bit_rate = br;

br是平均码率
是这样吗?
mediaxyz 23:47:06
是的
mediaxyz 23:47:51
也就是这样设置的码率会在Min,max之间波动
mediaxyz 23:48:11
如果设置qscale,则波动范围是非常大的,
mediaxyz 23:48:21
c->rc_min_rate =min;
c->rc_max_rate = max都控制不了
Leon 23:48:27
明白了
Leon 23:48:29
还有一个帧率的问题,在x264编码方式下,我设定了5帧,为什么不起作用?
AVRational time_base;
time_base.num = 1;
time_base.den = 5;
c->time_base= time_base;
mediaxyz 23:49:05
你是实时,还是转码?
Leon 23:48:55
实时
mediaxyz 23:49:23
转码不行
mediaxyz 23:49:27
实时可以控制
mediaxyz 23:49:38
控制的方法就是控制图像捕获的帧率传入就行了
mediaxyz 23:49:48
靠x264本身不行
Leon 23:49:42
呵呵,明白了!
Leon 23:50:04
我本想靠ffmpeg来控制的,就是不行!
mediaxyz 23:51:12
帧率控制是说:播放是的帧率
Leon 23:51:03
在ffmpeg中,time_base只是起到一个时间戳增量的作用,并不能控制帧率,对吧!
mediaxyz 23:51:31
不管你选择5还是10,时间戳是按照播放设置的
mediaxyz 23:52:11
播放的时候,读取这个按照5或者10计算的时间戳才设定播放时间区间,这个时候才其作用
Leon 23:53:21
如果输入的流是25帧,而我设的确是5,会产生什么后果吗,我这儿的测试结果是没有什么影响?
mediaxyz 23:53:37
不过ffmpeg的码率控制对x264不起作用
mediaxyz 23:53:53
不会
Leon 23:54:02
ffmpeg的码率控制对x264不起作用?按照前面的设定了也不能控制x264的码率?
mediaxyz 23:54:30
如果是实时捕获的,则捕获程序会丢弃
mediaxyz 23:54:42
这些情况我都测试过了
mediaxyz 23:55:07
本想写个ffmpeg心得,实在没有时间
Leon 23:55:10
如果是实时捕获的,则捕获程序会丢弃?如何理解?
mediaxyz 23:56:09
捕获程序有一个缓存,如果到特定时间,还没有把缓存中的数据清空,则自动丢弃
mediaxyz 23:56:23
directshow,vfw都是这样的
Leon 23:56:16
我现在想通过实时采集的视频,用x264编码,采用VBR,就是你前面说的几个参数设定,能起作用吗?
mediaxyz 23:56:57
那你最好采用第二种方法
Leon 23:57:01
就是:
c->flags |= CODEC_FLAG_QSCALE;
c->rc_min_rate =min;
c->rc_max_rate = max;
c->bit_rate = br;
mediaxyz 23:57:29
错了
mediaxyz 23:57:32
是第一种
mediaxyz 23:57:34
(2006-04-16 23:30:54)   mediaxyz(17328860)
c->bit_rate = br;
                c->rc_min_rate =br;
                c->rc_max_rate = br;
                c->bit_rate_tolerance = br;
                c->rc_buffer_size=br;
                c->rc_initial_buffer_occupancy = c->rc_buffer_size*3/4;
                c->rc_buffer_aggressivity= (float)1.0;
                c->rc_initial_cplx= 0.5;
Leon 23:57:29
why?
mediaxyz 23:57:56
第一种波动太大
mediaxyz 23:58:09
说糊涂了,不好意思
mediaxyz 23:58:14
第二种波动太大
Leon 23:59:20
可是波动太大也就其好处,当画面静止时,码流就很小,活动时,码流才上来,是这样的吗?
mediaxyz 23:59:49
是的
mediaxyz 23:59:58
如果是网络上传输,这种情况就惨了
Leon 00:00:12
我认为:网络上传输,这种情况应该更合适
mediaxyz 00:00:32
“码流才上来”,上来的可能会非常大
mediaxyz 00:00:52
是的,更合适,如果非常大,怎么办?
Leon 00:01:24
非常大?不是通过c->rc_max_rate = max;可以控制其最高码率吗?
mediaxyz 00:02:15
我刚才说,理论上是这样的,但ffmpeg实际没有实现
mediaxyz 00:02:19
ffmpeg的缺点
Leon 00:02:21
max就是我预计网络能承载的最大负荷。
Leon 00:02:31
喔,然来如此!
mediaxyz 00:03:02
ffmpeg中的h263,h263p比mpeg4要控制的好
mediaxyz 00:03:07
x264更糟糕
mediaxyz 00:04:39
睡觉了,改天再聊
Leon 00:04:32
不过在同等码率下,x264的视频质量要比其它的都好,比较的细腻。但其编码的效率不高。
mediaxyz 00:05:13
windows的x264已经非常不错了
Leon 00:05:18
如果你不介意,我把今天的内容发到论坛上,也算是你的经验吧!
mediaxyz 00:05:54
无所谓
Leon 00:05:46
晚安!

得出的结论:
ffmpeg中CBR(固定码率控制)的设置:
                c->bit_rate = br;
                c->rc_min_rate =br;
                c->rc_max_rate = br;
                c->bit_rate_tolerance = br;
                c->rc_buffer_size=br;
                c->rc_initial_buffer_occupancy = c->rc_buffer_size*3/4;
                c->rc_buffer_aggressivity= (float)1.0;
                c->rc_initial_cplx= 0.5;

ffmpeg中VBR(可变率控制)的设置:
                c->flags |= CODEC_FLAG_QSCALE;
                c->rc_min_rate =min;
                c->rc_max_rate = max;
                c->bit_rate = br;

刚才经过实验,得出如下结论:

ffmpeg的CBR可以控制得非常好,与设定值br十分接近
ffmpeg的VBR控制得非常不好,最高码流max没有限制住

与mediaxyz的说话完全吻合。

感谢mediaxyz奉献如此宝贵的经验。

我粗略的看了一下对话内容

我可以肯定的说:
80%以上的内容都是错误的,标准的误人子弟!

CODEC_FLAG_QSCALE;
表示固定量化,与VBR没有关系!具体怎么用你看看MpegEncContext中的成员:fixed_qscale,以及AVFrame中的quality就知道了

实际上FFmpeg的VBR和CBR都控制不好

但是从实验的数据来看,ffmpeg的CBR确实控制的不错,我设定值是50kbps,实际测试值平均为49.7kbps,编码器是x264,CIF格式,5fps。

VBR目前还没有找到好的解决方案,Fastreaming 你可以把你的VBR设值参数帖出来,探讨一下。

我按楼主说的CBR和 VBR进行设置,br=12*1000和br=10*1000进行测试,在对编码后的数据按秒计算平均值,结果差不多,不知道哪里错了,测试代码如下:
in_c->time_base.den = 25;
        in_c->time_base.num = 1;
        {
         bitrate=12000;
     in_c->bit_rate = bitrate;
     in_c->rc_min_rate =bitrate;
     in_c->rc_max_rate = bitrate;
     in_c->bit_rate_tolerance = bitrate;
     in_c->rc_buffer_size=bitrate;
     in_c->rc_initial_buffer_occupancy = in_c->rc_buffer_size*3/4;
     in_c->rc_buffer_aggressivity= (float)1.0;
     in_c->rc_initial_cplx= 0.5;
        }
        in_c->bit_rate=2000;//bitrate/100;   //12*1000k/s,低码流。值越大视频质量越好,值越小码流越低。MpegEncContext.qscale---量化参数。
        in_c->gop_size = 10; /* emit one intra frame every ten frames */
        in_c->max_b_frames=0;//两个非b帧之间的最大b帧数。
//        in_c->flags
        in_c->pix_fmt = PIX_FMT_YUV420P;

我在测试x264的cbr时,发现不加qcomp = 0,很容易vbv buffer underflow,但是加了之后,发现控制的非常好,而且没出现过vbv buffer underflow,请问这个qcomp 是什么用途。
`-qcomp compression'
video quantizer scale compression (VBR) (default 0.5). Constant of ratecontrol equation. Recommended range for default rc_eq: 0.0-1.0
谁能讲讲啊,对视频质量又是有何影响啊目前发现的一个影响是cpu(P6100) 100%.... 1fps

我使用的命令:ffmpeg -i d:\\test_video\\hd\\js.mpg -bufsize 1835008 -maxrate 6000000 -minrate 6000000 -b 6000000 -packetsize 2048 -muxrate 10080000 -vcodec libxavs d:\\test_video\\6kbps.mpg

http://blog.chinaunix.net/uid-24567872-id-3485819.html

FFMpeg的码率控制 - CBR or VBR相关推荐

  1. 视频编码中的RC(rate control)是什么?码率控制 CBR (Constant Bit Rate)、VBR (Variable Bit Rate)

    再看RXW源码的时候在视频编码结构体里有一个RC结构体,RC(rate control)到底是啥? 码率控制技术 RC (Rate Control) 是实际视频编码器中一个非常重要的技术模块. 根据实 ...

  2. H264---码率控制---CBR、VBR、ABR、CVBR四种编码方式

    在视频编码中,有一个模块是码率控制,即通过选择一系列编码参数,使得视频编码后的比特率满足所需要的速率限制,并且使编码失真竟可能小.该模块严格上不属于视频编码标准,属于率失真优化有两范畴.码率控制分为两 ...

  3. ffmpeg 设定码率

    主思路 H.264 的建议码率设定方案是 crf ,如果需要比较高的画质,可以设为10左右,如果要要兼顾画质和文件大小,可以设为17左右,默认是23. 详情 ffmpeg支持多种方法设定码率,-gp ...

  4. 视频编码码率控制:CBR、VBR和ABR

    下面介绍不同的码率控制模型和适用场景: CQP:固定QP,最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的,既不是码率优先模型也不是质量优先模型,不过是实现最 ...

  5. 码率控制、VBR、CBR

    码率控制实际上是一种编码的优化算法,它用于实现对视频流码流大小的控制.那么它控制的目的是什么呢? 我们可以试想一下,同样的视频编码格式,码流大,它包含的信息也就越多,那么对应的图像也就越清晰,反之亦然 ...

  6. ffmpeg 编解码 码率设置问题 CBR 、VBR

    之前都是利用硬件进行视频流的编解码 最近 在利用ffmpeg 编解码在CPU上进行软解软编码 之前别的硬件平台设置码率和vbr cbr的时候 提供了接口直接设置一下就可以 但是ffmpeg这里 并没有 ...

  7. 【from Spark!】音视频中的码率控制(CBR、VBR、CVBR、FIXQP)

    原文地址:https://blog.csdn.net/qq_28258885/article/details/118891810 什么是码率? 码率就是数据传输时单位时间传送的数据位数. 一般我们用的 ...

  8. 固定码率(CBR)与可变码率(VBR)

    固定码率(CBR)与可变码率(VBR) http://wang78hao.blog.163.com/blog/static/12116387120103308301776/ 一般在我们输出视频文件的时 ...

  9. FFmpeg码率控制

    在实际开发中,码率控制的需求还是比较多, 码率控制主要有以下几种: 1.CQP(Constant Quantization Parameter ) 特点: 值越大,压缩率越大,质量越低.使用方法(虽然 ...

  10. ffmpeg 码率控制

    -preset 取值范围10个等级,默认medium    选择越快,质量越差,文件越小,速度越快 -crf    取值范围18~28                   值越大,质量越差,文件越小, ...

最新文章

  1. zendframwork入口关键Zend_Application.php类
  2. php关系运算符语句,PHP基础__运算符和逻辑语句(三)
  3. error 1044 (42000):access denied for user ''@'localhost' to database 'mysql' 解决方法
  4. 前端月趋势榜:4 月最热门的 20 个前端开源项目 - 2104
  5. DVWA设置mysql_解决DVWA配置报错
  6. stanford-chinese-corenlp-yyyy-MM-dd-models.jar not exists解决
  7. hibernate工厂模式_Hibernate锁定模式–乐观锁定模式如何工作
  8. react学习(17)----ant design格式化日期
  9. nodejs mac启动相关命令
  10. 如何在 Mac 上将 PDF 转换为SVG矢量?
  11. IDEA-------Webstorm主题推荐
  12. git pull报错 Can‘t update no tracked branch
  13. K8S集群中网络通信故障常见问题的排查思路
  14. msg1500说明书_MSG1500刷机笔记
  15. 员工跟母亲吐槽被同事欺负,隔天母亲跑到公司打同事,结果蒙了
  16. address already in use :::8080,端口号已被占用
  17. 使用css弹性布局,让页面footer底部固定
  18. JointJS中文文档
  19. SQL Server DATEADD()实例讲解
  20. 离散作业用c语言编写覆盖,c语言论文3000字_优秀论文范文3000字_大一论文范文3000字...

热门文章

  1. iOS 视图控制器转场详解
  2. 国际区号+手机号正则校验
  3. 3dmax su 简单_Sketchup导入3DSMAX的方法 3DMAX导入SU技巧
  4. 《电路分析基础》第11章 耦合电感电路 读书笔记
  5. JAVA之ZIP、RAR解压工具类
  6. 【POJ3207】Ikki's Story IV - Panda's Trick
  7. Java基于POI来给导出的Excel动态添加水印
  8. 统计学 —— 单因素方差分析的应用与Excel实现
  9. 小学生“快乐读书吧”具体要求以及推荐书目集
  10. pdf里面的图片如何提取出来?