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都控制不好
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