zoukankan      html  css  js  c++  java
  • mediaxyz访谈录:ffmpeg的码率控制

    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
    我现在想通过实时采集的视频,用x[FS:PAGE]264编码,采用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
    是 的 
    me diaxyz 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奉献如此宝贵的经验。

    http://www.blogjava.net/sl2cj/articles/55193.html

    http://hi.baidu.com/zhupan19851230/item/693481d9f18f3fe054347fa5

  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/youngt/p/3699461.html
Copyright © 2011-2022 走看看