2012-07-13 56 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); 

感謝