半年前,我知道了H.264這個名詞。那個時候決定學習H.264,可是我連資料都不知道如何收集。而且整個學校就只有我一個人在學習H.264,找不到人交流,所以那個時候學得真的是舉步維艱,很痛苦,而能在網上認識一個學習H.264的朋友真的是一件讓我很高興的事。 后來慢慢在網
半年前,我知道了H.264這個名詞。那個時候決定學習H.264,可是我連資料都不知道如何收集。而且整個學校就只有我一個人在學習H.264,找不到人交流,所以那個時候學得真的是舉步維艱,很痛苦,而能在網上認識一個學習H.264的朋友真的是一件讓我很高興的事。
后來慢慢在網上找到了一些介紹H.264的文章,當然也找到了peter李的網站,找到了流媒體論壇。那個時候在論壇里看見別人問的問題,我都完全不懂。看見別人要這樣資料要那樣資料,我也不知道這些資料怎么能夠用得著。最有趣的是我居然把JVT的會議文章全部下載下來了——當時并不知道這幾百兆的東西到底怎么用,現在倒是知道它的用處了,看來還是沒有白下,呵呵~~~。
一開始就想,先看看標準吧。因為標準是英文的,又特別長。所以為了避免看了后面忘記了前面,我就開始翻譯,看一段翻譯一段。可是這個過程真的是又枯燥又痛苦。而且看著300多頁的東西,要像這樣來看完,還真是沒有勇氣和信心。想了想還是算了吧,看源代碼吧。當時因為知道JM是標準的測試模型,所以就看JM了。一開始看代碼可是很老實的,每句程序,每個變量都跟蹤。等把讀入參數、初始化變量跟蹤完了,才知道,這一段沒必要看那么細致,完全可以跳過的。
就這樣看代碼看不懂的時候就查標準、去流媒體論壇問。可是論壇有好處也有壞處,好處是可以有很多人參與,壞處是你問的問題無論怎樣都不可能馬上知道答案,于是一般來說對你繼續讀代碼就是一個阻礙。于是去找H.264的QQ群,很高興找到了“H.264家園”,可是隨后很失望——見不到人問,也見不到人回答我的問題。于是,生氣了,自己建了一個群,這樣終于有了一個比較好的交流環境。可是那個時候的H.264在我看來還只是一個遙不可及的華麗殿堂。QQ群里大家討論的問題我仍然不懂。而我為了能盡快弄個像樣的題目來作為畢業論文,那個時候也沒有繼續看H.264的內容,只不過花了一個半月的時間來實現一個在今天看來比較膚淺的錯誤隱藏算法(因為我給自己定的方向是錯誤隱藏)。
等到我的這篇論文完成已經是9月中旬了,而這個時候對H.264仍然是那么陌生。因為這段時間沒有繼續看H.264的內容,以前看過的內容,本來理解就不透徹、印象也就不深,所以基本上都忘記了。所以這個時候的我可以說對H.264還處在只是知道個概念的階段。H.264實在是個龐大的東西,而對于中國人來說,它又是如此的新(個人認為),大面積的商用都還沒有開始。我要想在畢業之前在這里面做點有價值的東西在當時看來實在不太可能,于是只有硬著頭皮繼續研究自己的錯誤隱藏,希望能給自己的畢業論文增加一點分量。這樣就開始看JM關于幀間錯誤隱藏的代碼。因為JM幀間錯誤隱藏比幀內的復雜得多,涉及到很多相關的問題。所以在看代碼過程中也要對這些問題做一些了解,再加上QQ群里的經常討論,讓我真正開始了學習H.264的起步。
等我把幀間錯誤隱藏看完,已經是10月底了,而這個時候正好我們學院要搞一次學術研討會。為了能給自己的畢業和以后找工作增加一點砝碼,我決定參加。于是開始準備會議報告,通過準備會議報告,讓我對H.264的整體框架又一次做了回顧和熟悉。時間終于走到了今天,我很高興地感覺到,自己已經站在H.264的門口了——總是有進步的。呵呵~~~
現在自己對學習H.264也有了一些自己的想法,所以寫出來和大家一起探討:
1、第一個階段:
學習H.264,首先要把最基本最必要的資料拿在手里,內容包括:標準文檔(即 ITU 協議)、測試模型(即 ITU 提供的編解碼器源代碼)、經典文章(即后面提到的文章)。怎么使用這些資料呢?首先看里面的《H.264_MPEG-4 Part 10 White Paper》,看完之后再看《Video coding using the H.264 MPEG-4 AVC compression standard》和《H.264 And MPEG-4 Video Compression》,然后可以抽空看《Overview of the H.264_AVC Video Coding Standard.pdf》。前三篇文章看完后,你應該對H.264的整體框架有個比較深入的了解了。這個時間可能只需要花費你三周左右的時間(對于我這樣的笨蛋好像是要這么長時間的。如果你碰巧用了比這個時間還長的時間,那并不說明你比我更笨,只能說明你肯定天天陪MM聊天去了。呵呵~~~),最后一篇文章是《Overview and Introduction to the Fidelity Range Extensions》,該文的價值主要在于對H.264的第四個檔次 high profile 做了介紹,前面的文章都沒有涉及該檔次。這個階段可以輔助多看點綜述類的文章,加強對 H.264 的初步了解。
2、第二階段:
然后你就可以看代碼了。這個時候你最常用的工具就是標準文檔和測試模型。看代碼也有講究。并不是像我開始那樣看得那么仔細,結果后來才知道遠沒有這個必要。正如peter李說的:看代碼也要先從整體框架入手。先搞懂H.264的整體框架在代碼里是怎么分布的,一個功能模塊的前伸模塊和后繼模塊是什么。也就是搞清楚整個代碼流程。這個階段對標準文檔的使用可能很少。如果你使用的測試模型是JM,那么有一個好處:JVT提供了該參考源代碼的說明書——H.264_MPEG-4 AVC Reference Software Manual(最新版本是JVT-X072),對編解碼的所有參數做了詳細介紹。另外JVT還提供了參考源代碼編碼器手冊JVTO079,對參考源代碼中編碼算法做了詳細闡述(ITU協議其實也就是解碼器手冊)。
3、第三階段:
然后你找到一個自己感興趣的切入點,開始以此為中心研究這個問題。你研究問題的時候應該是聯系測試模型來研究,這個時候你就需要仔細看代碼中對這個問題的實現了。這個階段我絕對支持你一行行代碼跟蹤,一個參數一個參數地跟蹤。而代碼中不懂的地方可能需要查標準。這時你再來看標準文檔就有了針對性。也因為能將標準文檔和代碼對應起來,從而看標準文檔也不覺得有太大困難,也能明白標準文檔說的是什么問題,在測試模型中是如何通過代碼實現的。在這個階段中,會牽連到很多H.264的相關知識,這樣通過以點帶線,以線帶面。你會對H.264的內容認識越來越多。而你也就找到了自己的方向,最終走上了締造中國人的H.264的光輝大道,呵呵~~~
==========【注意事項】==========
1、切忌將代碼和標準文檔獨立開看,否則,你的困難會很大(當然可能是因為我太笨了,對于“甜菜”的你可能無論怎樣都能應用自如。呵呵~~~)。
2、對于剛開始接觸H.264的人,切忌直接看代碼和標準,哪怕是將標準和代碼結合起來看,你也會不太順利。換句話說:在沒有了解H.264整體框架之前,你最好什么都不要做。
3、你千萬不要覺得自己參加討論,以及幫助別人找答案(當然是在你覺得別人問的問題你似曾相識的時候)是一個浪費時間的過程。因為你參加討論,特別是你幫別人找答案的時候,很多你似是而非的問題卻能夠得到一個更深刻的認識。
4、學問,學問,即要問也要學。不要養成自己的依賴思想。其實你在自己查資料的過程中,也會學到很多東西。比如會知道某個問題在哪篇文章里能找到答案,或者收集到更多相關問題的有價值的文章……而且自己查到的到底比別人告訴的印象深刻。
5、讀代碼要講究方法。代碼中有很多變量,不要一開始就去看頭文件,想把里面所有變量都弄清楚是什么。直接從 main 函數開始讀 c 文件就可以了。遇到不懂的變量再去查頭文件,如果頭文件里沒有說明,自己又理解不了的再去問其他人——不要一開始就養成依賴性。
6、使用 JM 的 TX 如果不需要研究高清,那么建議用 JM86。高版本為了支持高清,把很多原本容易理解的地方修改得晦澀難懂了,增加了理解代碼的困難。
PS :我所知道的三本講H264的中文書籍
1、《H.264和MPEG-4視頻壓縮》:歐陽合(我看的英文原版,翻譯過來的應該也不錯)
2、《新一代視頻壓縮編碼標準—H.264/AVC》:畢厚杰(書中有較多錯誤,但仍然值得買,建議只做參考)
3、《小波編碼與網絡視頻傳輸》:沈蘭蓀,卓力 (個人覺得不錯,有關于 high profile 的介紹)
——天之驕子·firstime——
2005年11月12日
原文:bbs.chinavideo.org/viewthread.php?tid=988