守正
分类:
2010-09-14 21:32:24
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 是 的 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奉献如此宝贵的经验。
有关该问题的讨论帖可参考ffmpeg工程组论坛中的相关讨论:
mediaxyz访谈录:ffmpeg的码率控制
chinaunix网友2010-09-15 14:55:42
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com