如何學習h.264協議

首先,我假定你已經具有如下基礎:

1 瞭解基本的視頻知識,知道什麼是YCbCr/YUV;

2 知道基本的視頻壓縮原理;

如果這兩條還不具備,那麼,停一下,補一下課。這方面的相關文章在網上一找一大把。

now,你爲什麼要學習H.264呢?可能你是個在校學生,要寫論文,拿着複雜的JM代碼無從下手。可能你是個開發人員要往已有的代碼裏添加一個碼率控制算法,但是拿着前人開發的代碼又感到一頭霧水。無論你具體做什麼,對264協議有個比較深的理解還是有必要的。

那先準備好以下幾樣東西:

1 H.264_MPEG-4 Part 10 White Paper;

2 H.264 Visa 和StreamEye;

這是兩個碼流分析軟件,前者有免費版本,後者有個免費版,屏蔽了一些功能,但是對初學者,足夠了。

3 碼流。你可以隨便去下兩個,很多地方都可以下到的。

4 matlab

你可能注意到,我提供的清單裏沒有H.264協議,沒有JM代碼,爲什麼?因爲這兩樣東西,太複雜,不合適初學者。即使現在,我看到H.264協議原本都還覺得複雜,JM代碼更是沒有怎麼看過。 這兩樣東西,不到做具體開發的時候沒有必要去詳細地研究。

那麼,如何理解H.264協議呢。 容易,我們可以手工完成一個264碼流的解碼過程,相信我,你如果專心,最多花30小時,就能基本完成這個過程。

264協議,其實也使用了與以前的協議類似的方法,但在各個環節中,都加入了不少的改進而已。

下面先簡要說明一下各個模塊的要點。

1 幀內預測。

這是個新概念,但其實就是使用相鄰的塊來預測當前塊。我們先只考慮4x4亮度塊的例子。

使用H.264 Visa打開一個碼流文件。從第一幀第一塊開始(無疑,是個I塊)。然後一個小塊一個小塊地做預測。需要注意的是,預測一個小塊,就重建一個小塊。重建你只需要把預測值加上殘差就可以了。你可以使用matlab來幫你完成這個過程。殘差值,現在先直接使用就可以,不必殘差是如何來的。重建後的小塊就可以作爲進一步預測的參考塊了。注意,要使用pre-loopfilter的數據。

2 幀間預測。

請先用264Visa 和StreamEye打開碼流,查看第一個P幀(通常是第2幀)。

樹狀的塊結構層次。你可以用StreamEye查看一下,能很容易地看到各個宏塊的結構類型。

Mv。你可以在H.264 Visa中查看一下,看看每個part的Mv是多少,注意,因爲運動矢量是以1/4像素爲單位的,所以(4,8),實際代表偏移了(1,2)個像素。然後可以根據Mv到上一幀找一下參考塊的位置,然後比較一下參考塊和預測塊,看看兩者是否近似(非整點情況)或相同(整點情況,比如Mv= (4,4))。

Mv的預測。找到當前塊的A、B、C塊,然後預測一下Mv,再看實際的Mv是多少。

自己根據Mv,找到參考塊。再在matlab中寫個插值程序,應該可以插出正確的值。

注意,做這個練習,應該在第一個P幀中來做,如果到第二個P幀中做,因爲涉及多參考幀的問題,找參考幀會比較麻煩。

3 變換量化。264中變換量化已經合在一起了,白皮書上已經有詳細說明。可以自己用matlab來算一下白皮書上的題目,再在碼流中找一個塊,做下反量化反變換,最後看看結果,和H.264 Visa的結果比一下。

4 CAVLC。

沒什麼可說的,理解一下CA,然後知道其實就是個改進了的Run-level編碼就可以。

5 Deblocking

理解一下Bs,理解一下閾值。注意,當梯度小於閾值時才做加權,爲什麼?

在H.264 Visa中比較一下pre-loop filter和final的數據。

6 碼流結構和語法。

用StreamEye可以查看碼流及其分析結果。

有了這兩個碼流分析工具,再結合白皮書,應該很快能掌握I塊,P塊的重建方法,並能熟悉碼流結構。

JM代碼太複雜,沒必要在這個階段看。協議,更煩瑣,不做完整開發的話也沒必要看了。可以看看市面上的相關的參考書。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章