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
23:41:26
你有沒有發現,ffmpeg是100*1000
23:41:37
并不是100*1024
leon 23:41:28
是的,
23:42:13
我看到有這樣一句話:
qscale
以<數值>品質為基礎的vbr,取值0.01-255,越小品質越好
23:42:30
而且在後面的進行中還是/1000
mediaxyz 23:42:43
是的
23:42:51
越小品質越好,碼率越大
23:42:55
那0.01-255範圍也太大了吧!
23:43:29
這是為了精細控制,實際上沒必要
23:43:42
我測試0。01-50就可以了
mediaxyz 23:43:52
再大圖像很糟糕
23:43:55
global_quality有什麼作用?
23:44:18
反正老外總是想的很周到
mediaxyz 23:44:35
global_quality你說的
<數值>品質
leon 23:44:36
就是我說的qscale值?
23:45:01
leon 23:45:01
這個值能不能動态的調整?
23:45:56
我沒有試過
mediaxyz 23:46:07
按照ffmpeg的調用規則,好像不行
23:46:32
按照你的說話,vbr設定如下幾個值就可以了:
c->flags |=
codec_flag_qscale;
c->rc_min_rate =min;
c->rc_max_rate =
max;
c->bit_rate = br;
br是平均碼率
是這樣嗎?
23:47:06
23:47:51
也就是這樣設定的碼率會在min,max之間波動
23:48:11
如果設定qscale,則波動範圍是非常大的,
23:48:21
max都控制不了
leon 23:48:27
明白了
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
你是實時,還是轉碼?
23:48:55
實時
mediaxyz 23:49:23
轉碼不行
23:49:27
實時可以控制
23:49:38
控制的方法就是控制圖像捕獲的幀率傳入就行了
23:49:48
靠x264本身不行
leon 23:49:42
呵呵,明白了!
23:50:04
我本想靠ffmpeg來控制的,就是不行!
23:51:12
幀率控制是說:播放是的幀率
23:51:03
在ffmpeg中,time_base隻是起到一個時間戳增量的作用,并不能控制幀率,對吧!
23:51:31
不管你選擇5還是10,時間戳是按照播放設定的
23:52:11
播放的時候,讀取這個按照5或者10計算的時間戳才設定播放時間區間,這個時候才其作用
23:53:21
如果輸入的流是25幀,而我設的确是5,會産生什麼後果嗎,我這兒的測試結果是沒有什麼影響?
23:53:37
不過ffmpeg的碼率控制對x264不起作用
23:53:53
不會
23:54:02
ffmpeg的碼率控制對x264不起作用?按照前面的設定了也不能控制x264的碼率?
23:54:30
如果是實時捕獲的,則捕獲程式會丢棄
23:54:42
這些情況我都測試過了
23:55:07
本想寫個ffmpeg心得,實在沒有時間
23:55:10
如果是實時捕獲的,則捕獲程式會丢棄?如何了解?
23:56:09
捕獲程式有一個緩存,如果到特定時間,還沒有把緩存中的資料清空,則自動丢棄
23:56:23
directshow,vfw都是這樣的
23:56:16
我現在想通過實時采集的視訊,用x[fs:page]264編碼,采用vbr,就是你前面說的幾個參數設定,能起作用嗎?
23:56:57
那你最好采用第二種方法
leon 23:57:01
就是:
23:57:29
錯了
mediaxyz 23:57:32
是第一種
23:57:34
(2006-04-16 23:30:54) mediaxyz(17328860)
c->bit_rate =
br;
c->rc_min_rate =br;
br;
c->bit_rate_tolerance =
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;
why?
mediaxyz 23:57:56
第一種波動太大
23:58:09
說糊塗了,不好意思
mediaxyz 23:58:14
第二種波動太大
23:59:20
可是波動太大也就其好處,當畫面靜止時,碼流就很小,活動時,碼流才上來,是這樣的嗎?
23:59:49
是 的
me diaxyz 23:59:58
如果是網絡上傳輸,這種情況就慘了
00:00:12
我認為:網絡上傳輸,這種情況應該更合适
00:00:32
“碼流才上來”,上來的可能會非常大
00:00:52
是的,更合适,如果非常大,怎麼辦?
00:01:24
非常大?不是通過c->rc_max_rate = max;可以控制其最高碼率嗎?
00:02:15
我剛才說,理論上是這樣的,但ffmpeg實際沒有實作
00:02:19
ffmpeg的缺點
00:02:21
max就是我預計網絡能承載的最大負荷。
00:02:31
喔,然來如此!
00:03:02
ffmpeg中的h263,h263p比mpeg4要控制的好
00:03:07
x264更糟糕
mediaxyz 00:04:39
睡覺了,改天再聊
00:04:32
不過在同等碼率下,x264的視訊品質要比其它的都好,比較的細膩。但其編碼的效率不高。
00:05:13
windows的x264已經非常不錯了
00:05:18
如果你不介意,我把今天的内容發到論壇上,也算是你的經驗吧!
00:05:54
無所謂
leon 00:05:46
晚安!
得出的結論:
ffmpeg中cbr(固定碼率控制)的設定:
c->bit_rate = br;
c->rc_min_rate
=br;
c->rc_max_rate = br;
c->rc_initial_cplx=
0.5;
ffmpeg中vbr(可變率控制)的設定:
經過實驗,得出如下結論:
ffmpeg的cbr可以控制得非常好,與設定值br十分接近
ffmpeg的vbr控制得非常不好,最高碼流max沒有限制住
與mediaxyz的說話完全吻合。
感謝mediaxyz奉獻如此寶貴的經驗。