2012-07-13 152 views
2

我用c代码使用FFMPEG API对视频进行转码。 我想使用ffmpeg的API来设置视频码率,如下图所示:通过ffmpeg设置视频比特率API被忽略了libx264编解码器

ovCodecCtx->bit_rate = 100 * 1000; 

我使用的编码器是libx264。

但是这个参数没有生效,并且所得到的视频质量很差。 我甚至尝试设置像rc_min_rate,rc_max_rate等相关参数,但视频质量仍然很低,因为这些相关参数不起作用。

任何专家都可以告诉我们如何使用FFMPEG API正确设置比特率吗? 谢谢

+0

从[文档](http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/structAVCodecContext.html) - “bit_rate:由用户设置; **不用于恒定量化器编码**” – sashoalm 2012-07-13 11:45:19

+1

另外,还有你确定它没有生效? 100千位不是很多,你用1 mbit尝试过吗?即'ovCodecCtx-> bit_rate = 1000 * 1000;' – sashoalm 2012-07-13 11:49:17

回答

0

我找到了解决我的问题。事实上,面临同样问题的人已经在ffmpeg(libav)用户论坛上发布了解决方案。这似乎也适用于我的情况。我发布了自己的问题的答案,以便面临类似问题的其他用户可以从这篇文章中受益。

问题:

编程设置视频码率的H264视频编解码器没有被libx264编解码器荣幸。即使它适用于MPEG1,2和MPEG4视频编解码器,该设置也不能用于H264视频编解码器。由此产生的视频质量非常差。

解决方案:

我们需要设置点的解码/调整大小的框架,他们被送入编码器前。 找到解决方案的人已经通过ffmpeg.c源代码,并能够弄清楚这一点。我们需要首先将AVFrame的pts从流的time_base重新缩放到编解码器time_base以获得简单的帧编号(例如1,2,3)。

pic->pts = av_rescale_q(pic->pts, ost->time_base, ovCodecCtx->time_base); 

avcodec_encode_video2(ovCodecCtx, &newpkt, pic, &got_packet_ptr); 

而当我们从libx264编解码器接收回来的编码数据包,我们需要将编码后的视频数据包的PTS和DTS重新调整到流时基

newpkt.pts = av_rescale_q(newpkt.pts, ovCodecCtx->time_base, ost->time_base); 
newpkt.dts = av_rescale_q(newpkt.dts, ovCodecCtx->time_base, ost->time_base); 

感谢