翻譯 | Alex
技術審校 | 章琦
本文來自OTTVerse,作者為Krishna Rao Vijayanagar。
編解碼器
Easy Tech
在本篇文章中,我們將學習影片編解碼器、影片編碼標準以及在資料壓縮和解壓縮的過程中,影片編碼標準是如何發揮作用的。
在前面介紹資料壓縮的文章中,我們已經證實,資料預測對於減少資料體積而言至關重要。
在預測的過程中,為了向另一端傳達壓縮資訊的含義和句法,我們最終設計了一門“語言”。這種語言的設計很微妙,我們在本篇文章中將重點說明。
資料壓縮和創造語言
為了理解影片編解碼器,我將請你傳送下列英語字母序列給你的朋友。但是,有限制條件:我們手邊的系統比較落後,它要用1位元組的空間儲存一個字母或數字。
資料:
注意
:直接告訴你,這裡有20個A和1個B(擔心你數不清楚),你要怎麼做呢?
答案:
我要說的是,有兩種顯而易見的技術能夠解決此問題(我們排除了所有高階熵編碼技術以假設你從未聽說它們)。
方法1:
每個A和B都使用1個位元組儲存,一共佔用21位元組的儲存空間。
方法2:
使用如下方法:
第一個字元“A”用1個位元組儲存
數字“20”用1個位元組儲存
字母“B”用1個位元組儲存
數字“1”用1個位元組儲存
我們最後就得出:
只用了4個位元組,厲害吧!
好了,我們把稱為碼流的A20B1傳給你的朋友吧!
等等!他該如何理解這個碼流?除了你我以外,其他人根本不知道它是什麼意思。是的!這就是我們需要定義一種語言來處理資料的原因。這種語言需要設定明確的規則來管理“編碼或壓縮”資料的“解碼和解壓縮”。
我們暫且將這種語言稱為
Compresslt
。
CompressIt
的規則非常簡單:
奇數字節代表要儲存的字母
偶數字節代表連續字母的儲存次數
設計完我們的語言後,我現在可以將 CompressIt 的規範釋出在網上以供其他工程師閱讀並發現可能存在的漏洞或錯誤。
一個只有兩行字的檔案中,還會有什麼錯誤?
我想說的是,非常有可能。比如,有人可能會站出來說:“嘿,夥計們!如果一個字母重複256次怎麼辦?我這麼問是因為256已經超過了一個位元組所能容納的值。”
糟糕!我們犯了一個大錯!但你看,這也說明了peer review的重要性!現在,語言創造者(你和我)需要重新制定一個更好的規範,並再次發給大家review。
整個過程會一直持續,直到解決所有問題,而且所有人(編解碼器工程師)將在這種語言規範上達成一致。
編解碼器誕生了!
我一直在上面的例子中使用“語言”一詞,但實際上你和我剛才做的正是在定義和實現一個編解碼器——
資料壓縮和解壓縮方案
。
在現實世界中,編解碼器是這樣誕生的(大部分情況):
一群被稱為“編解碼委員會”的人聚到一起,然後:
告訴全世界,現在需要新的編解碼器並明確規定要求(如:提高50%的壓縮率、能壓縮8K影片、新的色彩格式等)
徵求貢獻、提議和建議,並評估其可行性
協調所有必要的文件、測試和實驗,以確定生成編解碼器的規則和工具
最後,釋出編解碼器的標準供全世界使用
每一個影片編解碼器(H。264/AVC、AV1和VP9等)都需要經歷這樣一個過程。現在你知道編解碼器是如何誕生的了吧!
但是,有必要詳細解釋影片編解碼器嗎?直接釋出軟體不行嗎?這種標準難道不是在浪費時間和金錢嗎?
明確規範編解碼器對行業有何幫助?
好問題!為了更好地理解,讓我們回到上面Compresslt的例子。
如果俄羅斯的某位工程師想要為Compresslt編解碼器寫一個解碼器,他需要做的就是拿到一份編解碼器的規範並理解它。
在學習Compresslt的過程中,他意識到他需要:
獲取傳入的資料流或者讀取使用CompressIt壓縮的檔案
讀取奇數字節並用它表示字母(比如X)
讀取偶數字節(N)並用它表示出現N次字母X
重複這個過程直至檔案結束
準確的說,這就是編解碼器標準所實現的事——它明確規定了碼流的外觀和行為,以便所有人都可以為它編寫解碼器。
它不會告訴你如何建立碼流,只會告訴你碼流看起來應該是什麼樣子的。
下面這個現實中的例子充分說明了影片編解碼器及其規範的重要性。
假如你在網上看到了這樣的新聞:“蘋果將在下一個釋出的版本中新增對HEVC的支援”,這意味著蘋果的技術團隊:
下載了一份HEVC規範
閱讀規範(一遍又一遍,一遍又一遍——開啟規範,你就會明白為什麼要這麼做)
編寫一個程式,可以解碼HEVC碼流
計劃在下一次軟體更新時釋出該程式
他們為什麼能夠做到這些?
因為一群工程師聚在一起建立了HEVC影片壓縮標準,併發布了一份檔案,詳細說明了解碼的每個步驟和碼流的語義,這樣世界上的任何人都能為它編寫解碼器。
編解碼器規範會定義編碼器嗎?
不會,但是這個問題有些歧義,讓我來解釋一下。
編解碼器規範會告訴你語言中存在哪些工具,編碼器的輸出應該是什麼樣子,以及解碼器會如何解析它。
但這也意味著你可以以任意一種方式編寫編碼器——
只要編碼器產生的碼流符合規範的要求。
這是我最想強調的重點。
換言之,
如果你正在使用CompressIt 壓縮資料,你不能切換奇數字節和偶數字節的含義,這樣所有解碼器都會將它們混淆。
但是,你可以使用任意技術計數和記錄連續的字母,以及它們重複的次數。如果你願意的話,你還可以用量子計算機!只要你能確保從編碼器輸出的碼流符合規範。
注意:
你肯定會因為使用量子計算機而被解僱,但你仍然能編寫一個有效的編碼器,是不是看到了一線希望?
很好,現在你需要回答一個問題。
當你編寫編碼器或者解碼器的時候,你怎麼能知道它會順利執行呢?換句話說,有沒有可以比對程式碼的黃金標準或者參考編碼器/解碼器?
測試模型和參考編碼器&解碼器
為了滿足大家對黃金標準和參考的需求,編解碼器委員會和工作組釋出了“測試模型”和參考編碼器和解碼器。
但它們並不會最佳化速度和效能,僅包含符合規範的編碼器和解碼器的實現,你可以使用它們來驗證編碼器實現生成的碼流。
此外,委員會經常釋出符合標準的編碼碼流。解碼器製造商可以使用這些碼流來測試他們的軟體或硬體是否遵循編解碼器規範。
結束語
我希望你現在已經理解了什麼是影片編解碼器、影片編碼標準以及它們與編碼器和解碼器開發之間的關係,在後續的文章中,我們將一起學習影片編解碼器中的各類工具是如何工作的。
致謝
本文已獲得作者Krishna Rao Vijayanagar授權翻譯和釋出,特此感謝。