H.264學習歷程(天之驕子)

半年前,我知道了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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456147.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

插入排序:表折半插入

在前一篇插入排序:表插入中。我們用靜態鏈表的存儲方式。直接插入的策略,構建了一種新的插入排序算法:表插入。有人可能會想到:相同是靜態鏈表的形式,為什么不使用更高效的折半插入策略呢?這樣的想法真的非…

C++編譯報錯:重復定義

http://note.youdao.com/noteshare?idcb2bed862a2daae89775603168f297af轉載于:https://www.cnblogs.com/taiyang-li/p/6637093.html

【機器學習】sklearn實現---歸類為5大類

sklearn實現---歸類為5大類 sklearn.preprocessing.scale()(最常用,易受異常值影響)sklearn.preprocessing.StandardScaler()sklearn.preprocessing.minmax_scale()(一般縮放到[0,1]之間,若新數據集最大最小值范圍有變…

關于安裝deepin+window10雙系統有時沒有聲音的問題

關于安裝deepinwindow10雙系統有時沒有聲音的問題 這個問題小編目前還沒有解決,求大神幫忙! deepin社區官網:深度科技社區 還可以參考一下其他的教程 深粉交流:新手剛剛安裝好DEEPIN,但沒有聲音,怎而解決? 冰封飛飛(云網牛站):在Deepin系統中…

如何讀H.264的標準和代碼

首先,還是要弄清楚編解碼的流程和 H.264 的關鍵技術,看白皮書就知道了,另外 H.264 綜述類的文章和別人的學位論文一般也會講到; 其次,弄清楚代碼的各個函數實現的功能,這個可以看看 JM 代碼里各個函數前面的…

Kafka官方文檔翻譯——實現

IMPLEMENTATION 1. API Design Producer APIs Producer API封裝了底層兩個Producer: kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【機器學習】熵、決策樹、隨機森林 總結

一、熵 公式: ?∑i1np(xi)?log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}?i1∑n?p(xi)?log2?p(xi) ∑i1np(xi)?log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n?p(xi)?log2?p(xi)1? import numpy as np# 賬號是否真實:3no&#xff…

HDU 4857 逃生(拓撲排序)

拓撲排序 一.定義 對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序&#xff0c;是將G中所有頂點排成一個線性序列&#xff0c;使得圖中任意一對頂點u和v&#xff0c;若<u&#xff0c;v> ∈E(G)&#xff0c;則u在線性序列中出現在v之前。 通常&#xff0c;…

關于deepin系統安裝design compiler的問題解答

關于deepin系統安裝design compiler的問題解答 Design?Compiler是Synopsys綜合軟件的核心產品。它提供約束驅動時序最優化&#xff0c;并支持眾多的設計類型&#xff0c;把設計者的HDL描述綜合成與工藝相關的門級設計&#xff1b;它能夠從速度、面積和功耗等方面來優化組合電…

iOS 數據持久化-- FMDB

一、簡介 1.什么是FMDB FMDB是iOS平臺的SQLite數據庫框架 FMDB以OC的方式封裝了SQLite的C語言API 2.FMDB的優點 使用起來更加面向對象&#xff0c;省去了很多麻煩、冗余的C語言代碼 對比蘋果自帶的Core Data框架&#xff0c;更加輕量級和靈活 提供了多線程安全的數據庫操作方法…

【機器學習】交叉驗證篩選參數K值和weight

交叉驗證 導包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import datasets#model_selection &#xff1a;模型選擇 # cross_val_score: 交叉 &#xff0c;validation&#xff1a;驗證&#xff08;測試&#xff09; #交叉驗證 from s…

jqGrid列的統計

$("#List").jqGrid({ url: "${pageContext.request.contextPath}/cbfx/getCbhzList.do", datatype: "json", mtype: GET, colNames:["成本類別","費用","去年同期費用","備注"], colMod…

手機只能簽榮耀!最忠誠代言人胡歌喊你去天貓超品日

在你心中&#xff0c;男神胡歌是什么樣子&#xff1f;“御劍乘風來&#xff0c;除魔天地間。”也許是《仙劍奇俠傳》里飛揚跋扈、青春不羈的俠客李逍遙。“遍識天下英雄路&#xff0c;俯首江左有梅郎。”也許是《瑯铘榜》中才智冠天下&#xff0c;遠在江湖卻名動帝輦的麒麟才子…

歐式距離與曼哈頓距離

歐式距離&#xff0c;其實就是應用勾股定理計算兩個點的直線距離 二維空間的公式 其中&#xff0c; 為點與點之間的歐氏距離&#xff1b;為點到原點的歐氏距離。 三維空間的公式 n維空間的公式 曼哈頓距離&#xff0c;就是表示兩個點在標準坐標系上的絕對軸距之和&#xff1a…

在maven pom.xml中加載不同的properties ,如localhost 和 dev master等jdbc.properties 中的鏈接不一樣...

【參考】&#xff1a;maven pom.xml加載不同properties配置[轉] 首先 看看效果&#xff1a; 點開我們項目中的Maven projects 后&#xff0c;會發現右側 我們profile有個可勾選選項。默認勾選localhost。localhost對應項目啟動后&#xff0c;會加載配置左側localhost文件夾下面…

4.8-全棧Java筆記:包機制

包機制是java中管理類的重要手段。 開發中&#xff0c;我們會遇到大量同名的類&#xff0c;通過包我們很容易對解決類重名的問題&#xff0c;也可以實現對類的有效管理。 包對于類&#xff0c;相當于&#xff0c;文件夾對于文件的作用。package我們通過package實現對類的管理&a…

python安裝以及版本檢測

Windows 安裝 Python 3 目前Python有兩個大版本&#xff0c;分別是 2.X 和 3.X &#xff0c;我們的教程基于最新版本 3.6.1 首先我們需要獲取Python的安裝包&#xff0c;可以從官網獲取&#xff0c;如果你因為沒有VPN工具而無法訪問官網的話&#xff0c;我已經將它放在網盤了&…

【機器學習】梯度下降原理

import numpy as np import matplotlib.pyplot as plt %matplotlib inlinef lambda x :(x-3)**22.5*x-7.5 f2 lambda x :-(x-3)**22.5*x-7.5求解導數 導數為0 取最小值 x np.linspace(-2,5,100) y f(x) plt.plot(x,y)梯度下降求最小值 #導數函數 d lambda x:2*(x-3)*12.…

C語言的面向對象設計-對X264/FFMPEG架構探討

本文貢獻給ZSVC開源社區&#xff08;https://sourceforge.net/projects/zsvc/&#xff09;&#xff0c;他們是來自于中國各高校的年輕學子&#xff0c;是滿懷激情與夢想的人&#xff0c;他們將用自己的勤勞與智慧在世界開源軟件領域為中國留下腳步&#xff0c;該社區提供大量視…

linux gtest安裝

1. 安裝cmake, 具體步驟這里不詳說。 2. 下載源碼&#xff1a;https://codeload.github.com/google/googletest/zip/release-1.8.0 3. 解壓源碼&#xff1a;unzip googletest-release-1.8.0.zip 4. 進入源碼目錄&#xff1a;cd googletest-release-1.8.0 5. 創建并進入目錄buil…