天天看點

mediaxyz訪談錄:ffmpeg的碼率控制

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奉獻如此寶貴的經驗。