學習視頻編解碼技術很難嗎?視頻編解碼技術的未來是什么?
明了的說,無論是軟件還是硬件設計,視頻編解碼技術有很多難點,都需要很長一段時間積累才行。
從一開始接觸MPEG-2到最新的H.264標准,可算走過了一段心酸之路。
90 年代以來,隨着internet和數字通信的迅猛發展,視頻編解碼技術在通信和廣播領域獲得了日益廣泛的應用,特別是在數字電視系統發展中更是展露鋒芒。
從 1984 年 CCITT公布第一個視頻編碼國際標准以來,至今已有二十多年了。ITU-T 等國際標准化組織陸續頒布了接近十個視頻編碼國際標准,大大推動了視頻通信和數字電視廣播的發展,這也是有目共睹的事實。但是嚴格地講,這兩大領域至今的發展仍不能令人滿意,總起來講,應用的范圍不廣,主要是視頻壓縮與質量之間的矛盾不能很好解決。例如,可視電話一直被認為是一種理想的通信設備,可近 30 年來至今未能普及,就是因為性能價格比不高。
短短的二十幾年就有十幾個標准的誕生,對設計者來說真是一個知識爆炸的“時代”。我從2003年接觸編解碼技術,當時真是一頭污水,每天尋找資料,書籍,就想把它一點點的學好.
簡單敘述一下我的264學習經過吧
首先我覺得先要找相關書籍把基本原理搞懂,不要急於看標准和源代碼。要知道什么是采樣格式,什么是I、P、B,他們的原理是什么,了解CAVLC、CABAC熵編碼的實現過程,一定要認認真真。這樣各個主要模塊攻克之后,你就可以結合標准和源代碼一步一步的看下去。
下面以解碼過程為例說一下具體過程:
1、 過程:碼流→NALU→RBSP。

如果是字節流的碼流當然就首先要對字節流進行解析,這就要看附錄 B 了,如何查找起始碼和去除偽起始碼(為什么有偽起始碼呢?);如果是 RTP 格式的碼流,那就要按 RFC3984 來解析了(標准沒有規定 RTP 格式碼流的解析過程);字節流解析完后提取出來的就是 NALU 了,對 NALU 的解析就要看第七章了。黑色的粗體字都是在碼流中可能出現的語法元素,解碼器的首要任務就是要對這些語法元素進行解析。對於這些碼流中的語法元素我們要進行解析必須知道三個問題:
(1)、什么時候存在於碼流中?這樣我們才能知道當前解析的是哪個語法元素;
(2)、采用什么樣的熵編碼方式?這樣我們才能知道如何解析;
(3)、含義是什么?這樣我們才知道解析出來之后用來干什么。
NALU 的前面三個語法元素所組成的一個字節我們稱為 NALU 頭,其余部分(也就是語法表 7.3.1 中的其余部分)我們稱為 NALU 體。對 NALU 體的解析要看 7.3.2 小節。因為 NALU 有很多種類型,所以要針對 NALU 的不同類型去解析 NALU 體(表 7-1 說明了不同 NALU 對應的語法表)。例如,如果當前的 NALU 是 SPS,那么當然就要看 7.3.1 小節;如果當前的 NALU 是 DPA,那么當然就要看 7.3.2.9.1 小節了;
2、對於屬於 VCL 的 NALU(哪些 NALU 是 VCL NALU 呢?如果你看了 nal_unit_type 的語義,你就應該知道),例如表 7-1 中類型為 5 的 NALU,根據表 7-1 我們知道 NALU 體的語法表是 7.3.2.8。而從 7.3.2.8 我們可以看到,對這種 NALU 的 NALU 體解析實際就是對片級語法進行解析。語法表 7.3.2.8 顯示片級語法解析首先要解析 slice_header()(這種帶括號的表示是另一個語法結構),那么 slice_header() 怎么解析呢?往下看,7.3.3 的所有內容都被第一行的 slice_header() 包括在內,所以 7.3.3 就是對 slice_header() 這個語法層的碼流規定;
3、按照語法表 7.3.2.8 解析完了 slice_header() 就該解析 slice_data() 了。下面以最常見的 I 幀(CAVLC 熵編碼、非 MBAFF)的解析過程為例簡單描述怎么繼續讀標准。這時在碼流中出現的第一個 slice_data() 層的語法元素是語法表 7.3.4 中的 macroblock_layer(),也就是說直接到了宏塊層的語法解析,那就要又要看 7.3.5 小節了;
4、基於我們對編解碼流程的了解,我們知道解碼是一個預測值加殘差得到重建圖像的過程,那么我們下面的解碼過程就要分成兩步走了:首先,得到預測值;其次,得到殘差。基於我們對 H.264 關鍵技術的了解,我們知道 intra 宏塊(提醒:我們舉的例子是 I 幀,因此解析的是 intra 宏塊)的預測值是需要使用到預測模式的,所以我們需要解析語法表 7.3.5 中的 mb_pred(mb_type) 語法層,那么又去看 7.3.5.1 小節。按照 7.3.5.1 小節解析出宏塊或塊的預測方式后我們怎么計算預測值呢?去看標准 8.3 小節;得到預測值后我們繼續按照語法表 7.3.5 解析語法元素直到 residual() 語法層,這就又要去看 7.3.5.3 小節;按照 7.3.5.3 小節解析出殘差系數后我們如何把它還原成真實的殘差呢?去看標准 8.5 小節;
5、預測值和殘差都有了,加起來就是解碼圖像了。解碼的主要工作到此也算基本完成了。當然,上面的過程中還會用到標准其他章節的相關內容(例如,8.5 小節會用到 5.7 小節中定義的 InverseRasterScan)總體過程也就如此吧,詳細內容要大家自己去認真的學習
入門不易,要成為大師很難。要在編解碼業修煉成精也要有相當時間磨練和積累。成不了大師會成什么?
入了門,只要條件能配合,走上專職這條路是相當自然的。這里說的條件是什么呢?個人覺得毅力是第一,再者就是進修,第三是時間,還有是學習環境。大家都知道IT業的演進比換季還快。學校雖盡其可能傳授學生最新的知識,但很可能學校所學的一畢業就過時了。乘着工作的機會,接觸新知識就成了最重要的進修方式。能不能把握好這些機會,決定着技術層次和前程。
不是一番寒徹骨,怎得梅花撲鼻香。