多媒體開發(15):H264的常見概念
H264,是你常見的技術術語了吧。
那h264是什麼東西呢? H.264是視訊編碼標準,又是標準,得標準得天下啊。 在術語的拼寫上,小程以能理解為準。
本文介紹H264的常見概念。
預警,本文相對枯燥,你可隨時放棄閱讀。
(1)H264從哪裡來?
之前介紹媒體格式的概念時,有提到過國際標準化組織(ISO),現在又是它出場的時候。
H264是國際標準化組織(ISO)與國際電信聯盟(ITU)的產物。
但ISO是大boss,給的是造福人類的方向,真正做這件事的是他的下屬MPEG,MPEG是動態影象專家組。
同樣,ITU也有專家組來獨領風騷,叫VCEG,即視訊編碼專家組。
H.264有很多乳名,比如:H.264/AVC、AVC、H.264/MPEG-4 AVC,等等。
(2)H264有什麼優勢?
h264是ISO與ITU合作的結晶體,而在這之前,這兩家都有自己的產品,比如ITU有h261、h263、h263+,而MPEG有MPEG-1、MPEG-2、MPEG-4等。
兩家共同的研究成果自然不能比以往的差,h264比h263或mpeg-4的壓縮率都要高(在同等畫質下)。
h264優勢在於,在同樣的畫質下,擁有更高的壓縮率(更低的位元速率)。所以,看視訊的同學有福利了,因為這意味著,可以更省流量,並且降低了對你網速的要求,你還在用40KB/s的速度看大片嗎?
(3)H264的設計
(a)vcl與nalu
h264在設計上分不同的部分,涉及到複雜的概念,比如vcl與nal的劃分、幀內與幀間預測編碼、整數變換、熵編碼,等等。小程這裡只介紹一些簡單的概念。
h264在設計上,分vcl跟nal兩層。
vcl,video coding layer,即視訊編碼層,負責編碼視訊,獨立於網路環境。
nal,network abstraction layer,即網路抽象層,把vcl提供的資料進行封裝,應用於網路傳輸。
nal層的基本單位叫nalu。
nalu,network abstraction layer unit,網路抽象層單元。
nalu的大致結構是這樣的:
RBSP,是原始資料(可能是編碼的視訊資料,也可能是其它資料),加上用於對齊的“0”位元位。
nalu的頭,共8bit:
forbidden_bit(1bit): 禁止位,用於糾錯。 nal_reference_bit(2bit): 重要程度標識,越大則越重要,0是最不重要的。 nal_unit_type(5bit):低5位,用於區分nalu的型別。
nalu的型別:
表中的nal_reference_bit標識了重要程度(越大越重要)。
nal_unit_type為1到5時,為切片(slice)的資料,也就是視訊編碼資料。如果值是5,則可以理解為IDR幀,也就是一個影象序列的第一個I幀。
nalu除了封裝切片資料(視訊資料),還可以封裝其它型別的資料,比如nal_unit_type為7與8時,對應的是序列引數(sps)與影象引數(pps),這兩個資訊對於解碼是必須的。注意,nalu裡面的資料是嚴格按格式來的,而且不會出現startcode這樣的資料,那個要根據實際場景來考慮是否加上,加到幀資料裡。
nalu包含的內容,就是rbsp的內容,rbsp的內容也有這樣的分類:
總得來說,nalu是資料封裝單元(只是一個數據載體),可以是引數據(比如一個pps),也可以是視訊編碼資料。幀(即影象),由若干個nalu構成,一個nalu如果是視訊資料,則可以由若干個“slice”組成。slice(片)是h264引入的概念,而“幀”的概念在h264之前就存在,所以不要把兩者混為一體。這裡引用網路上的兩個圖片來區分各個概念(圖中的P只是一個演示,是幀的概念):
(b)I幀等
然後,小程介紹I幀、P幀之類的概念,這是你可能經常遇到的概念。首先,幀,是圖片的意思,是影象序列上的概念。
壓縮是為了節省儲存容量與傳輸頻寬,體積小而質量又好,是追求的目標。
視訊壓縮的關鍵點是去掉冗餘。
冗餘是什麼?你有我也有的(相關的)是冗餘,我感覺不到的也是冗餘。
h264編碼去除冗餘有兩個方向,一個是幀內預測編碼,另一個是幀間預測編碼。
幀內預測,關注於一張獨立的圖的冗餘(不考慮與前後圖的聯絡),把這張圖的冗餘(巨集塊之間的冗餘)去掉。
幀間預測,關注於前後圖間的冗餘,只保留差別,並依賴於參考幀。幀間預測編碼產生的幀,分為P幀與B幀。
所有幀參與分組,這個影象的組,也叫影象序列,即GOP。
而GOP很多時候是表示影象組的長度,可以設定。
一個影象序列內的影象是相關緊密的,也就是當更換場景(大變化來了)時就應該另起一個GOP。
MPEG2、h264與HEVC關於GOP的定義是不一樣的,所以在討論GOP時有必要先弄清楚是哪一個標準,這裡講的是h264。
h264的影象序列中,以IDR幀開始,到下一個IDR幀結束,一個影象序列中可以出現多個I幀。
GOP的第一個I幀,叫作IDR幀,區分於其它普通的I幀,所以IDR是I,但I未必是IDR。
IDR出現,意味著歷史作廢(歷史的錯不要影響到當前組),不能再依賴之前的影象,而要重新開始編碼。
一般來說,連續影象變化小(比如錄屏時緩慢滑動螢幕)則GOP值大,而且一個IDR後就可以連續用P或B幀來表示;變化大時(快速滑動螢幕)則GOP值小,可能一個IDR加兩三個P幀後就切到下一組序列了,這時編碼出來的體積也更大,如果傳輸的話就會產生頻寬峰值。
IDR,叫即時可解碼幀。
I幀,即Intra-predicted Frame,幀內預測幀。I幀還有很多同義詞,比如關鍵幀、獨立的完整影象、基本幀等。
I幀類似於JPEG的壓縮演算法。
P幀與B幀,都是幀間預測編碼,也就是要依賴於其它幀,它本身只是差異內容(差值與運動向量)。
P幀,前向預測編碼幀。P幀表示的是這一幀與之前的某個關鍵幀(或P幀)的差別,解碼時需要用之前快取的畫面疊加上本幀的差別,生成最終畫面。
B幀,雙向預測編碼幀。B幀依賴於前面的I或P幀,並且依賴於後面的P幀,所以解碼B幀時,既要取得之前的快取畫面,也要解碼之後的畫面,才能疊加出最終的畫面。
從壓縮率來說,B>P>I,而解碼複雜度來說也是這樣。一般(I+P)這樣的等級用得最多。
I跟P都是會成為參考幀,所以要注意影響,你差則別人也差。
至此,小程把H264一些常見的概念介紹完畢了。
總結一下,本文介紹了H264編碼標準的一些常見的概念,希望能幫到你,對H264有一個概念上的理解或瞭解。
相關推薦
多媒體開發(15):H264的常見概念
H264,是你常見的技術術語了吧。 那h264是什麼東西呢? H.264是視訊編碼標準,又是標準,得標準得天下啊。 在術語的拼寫上,小程以能理解為準。 本文介紹H264的常見概念。 預警,本文相對枯燥,你可隨時放棄閱讀。 (1)H264從哪裡來? 之前介紹媒體格式的概念時,有提到過國際標準化組織(ISO)
多媒體開發(18):FFmpeg的常見結構體
除了之前講的avpacket跟avframe,FFmpeg還有其它一些結構經常在流程中出現。FFmpeg還有哪些常見的結構呢?先來看一下這個截圖: 這張圖中的主角,是AVFormatContext。AVFormatContext是FFmpeg的基本結構之一,對應於封裝格式(或容器格式)。 圍繞FFmpeg
Windows Phone開發(15):資源
樣式表 為什麽 sent name for cor 控件 tar resource 活字印刷術是我國“四大發明”之一,畢昇在發明活字印刷術之後,他很快發現一個問題,隨著要印刷資料的不斷增加,要用到的漢字數目越來越多,於是,他必須尋找一種有效的辦法去管理那些刻有漢字的立方體(
多媒體開發(3):直播
特點 nss ams 測試的 方式 input cat nginx 成功 之前介紹了如何錄制音視頻,以及相關的多媒體的概念。對於已經錄制的多媒體進行“就地”播放(參考前文),就是回放,除了“回放”這個流程,還有一個流程也會經常遇到,那就是“直播”。 本文介紹直播的實現。 “
多媒體開發(6):濾鏡實現各種圖片效果 | Video-Filters | 變色
命令行 let img 很多 保持 yuv 黑白 多媒體 ati 之前講過使用FFmpeg的drawtext濾鏡(把圖片或文字加到視頻上),而實際上,FFmpeg的濾鏡很強大,遠不止加字幕或加圖片的功能。濾鏡是很有趣的,可以把圖片變模糊、變色、縮放旋轉,等等。 本文介紹FF
多媒體開發(8):調試FFmpeg
run 包括 啟用 return tar.bz2 %d 參考 efi turn 編譯FFmpeg得到二進制文件,之後就是對二進制庫的調用,這時FFmpeg就像一個黑盒子。作為程序員,難道不想研究一下FFmpeg的具體實現?比如是怎麽拿到歌曲信息的、怎麽解碼的、怎麽推流的,等
多媒體開發(9):聲音采集的概念 | 振幅 | 頻率 | 共振 | 電平化
坐標 波形 上下 樣本 形狀 多少 為什麽不使用 dsd 運動 之前介紹通過ffmpeg程序來錄制聲音或圖像,這個辦法是一個操作的過程,很少涉及到概念上的東西。 而本文,要介紹的是聲音采集的一些流程與概念。 聲音的采集流程與概念,是枯燥的,你如果不想了解的話,到這裏就可以退
多媒體開發(10):從視訊中提取圖片
小白:提取視訊中的圖片嗎?那很簡單,播放視訊再截圖就行啦。 播放視訊再截圖的做法,當然也可以。但是,手動地截圖會太累而且無法保證準確度,特別是需要反覆提取圖片時,或者需要提取“105秒那一瞬間的美女圖片”時,或者我需要每秒出一張圖片時,那有別的辦法嗎? 本文介紹,如何使用FFmpeg實現從視訊中提取圖片的
多媒體開發(11):Android平臺上裁剪m4a
Android手機上設定鈴聲的操作比較靈活,你聽到一首喜歡的歌曲,馬上就可以對這首歌曲進行裁剪,裁剪到片段後,再通過系統的介面設定為鈴聲(電話鈴聲、鬧鐘鈴聲等)。前提是,播放這首歌的APP,需要提供裁剪歌曲的功能。 那麼,怎麼樣實現擷取音訊檔案的功能呢? 基於之前的介紹,你可能很自然就想到使用FFmpeg命令
多媒體開發(12):解碼aac到wav檔案
簡單來說,aac是一種音訊編碼格式,需要解碼後才能用於音訊輸出。aac編碼格式,已經是一種很常見的音訊編碼格式,以至於很多系統都支援aac的編解碼,比如iOS上的AudioConverterRef介面、Android上的MediaCodec介面等。 但是,不要以為用了系統的介面就是用了硬體解碼,因為,這個系統
多媒體開發(14):媒體格式的概念
之前講了一些音視訊的錄製操作,還有聲音採集的概念。採集只是多媒體操作流程中的一個環節,更多的環節可以看看這個圖: 聲音或視訊採集後,就是編碼、寫檔案或推流。不管是編碼還是寫“檔案”,你都能找到相應的程式(比如FFmpeg)來完成,一般加上自己的業務程式碼就能實現自己的功能需求。那就沒有東西好說的了? 沒東
多媒體開發(16):幀率與位元速率的概念
為什麼說音視訊開發入門較難,因為涉及到很多概念,之前還專門講“媒體格式”、“h264概念”的東西。現在又來,“幀率”跟“位元速率”,這也是兩個常見的概念。你應該經常聽到“重新整理的幀率是多少”或“位元速率比較高所以網速要比較快”的表達吧。 本文介紹音視訊的幀率與位元速率的概念。 (1)幀率 幀率,表示的是頻率
多媒體開發(2):錄製視訊
上一節介紹了用ffplay來播放檔案(或url),這裡有一個概念,如果是播放已經存在的檔案,那叫“回放”,也就是Playback(從流媒體的角度也叫點播),如果播放的是正在錄製的資料(邊錄邊播),那叫直播。 不管是回放還是直播,都需要有媒體資料,那這個媒體資料是怎麼來的呢?從已有的檔案編輯而來是一個辦法,但
多媒體開發(6):用濾鏡實現各種圖片效果
之前講過使用FFmpeg的drawtext濾鏡(把圖片或文字加到視訊上),而實際上,FFmpeg的濾鏡很強大,遠不止加字幕或加圖片的功能。濾鏡很有趣,可以把圖片變模糊、變色、縮放旋轉,等等。 **本文介紹FFmpeg濾鏡的使用。目的是讓你感受一下FFmepg的濾鏡效果,這樣在實際需要某種效果時,可以考慮使用
多媒體開發(7):編譯Android與iOS平臺的FFmpeg
編譯FFmpeg,一個古老的話題,但我還是介紹一遍,就當記錄。之前介紹怎麼給視訊新增水印時,就已經提到FFmpeg的編譯,並且在編譯時指定了濾鏡的功能。 但是,在手機盛行的時代,你可能更需要的是能在iOS或Android平臺上執行的FFmpeg,而對於命令列的ffmpeg,你可以在個人電腦上面使用(因為它簡
多媒體開發(8):除錯FFmpeg
編譯FFmpeg得到二進位制檔案,之後就是對二進位制庫的呼叫,這時FFmpeg就像一個黑盒子。作為程式設計師,難道不想研究一下FFmpeg的具體實現?比如是怎麼拿到歌曲資訊的、怎麼解碼的、怎麼推流的,等等。 看原始碼是理解程式碼實現的一個辦法,而單步除錯能從另一個維度去幫到你。**本文介紹如何單步除錯FFm
多媒體開發(9):我是聲音
之前介紹通過ffmpeg程式來錄製聲音或影象,這個辦法是一個操作的過程,很少涉及到概念上的東西。而**本文,要介紹的是聲音採集的一些流程與概念。** 聲音的採集流程與概念,是枯燥的,但是,我也會盡量說一些有趣的現象來緩解這種枯燥。 聽得到的,或聽不到的聲音,抽象來說,都是模擬訊號,也可以形象一點,叫能量波
多媒體開發(10):提取圖片以及點陣圖儲存
> 小白:提取視訊中的圖片嗎?那很簡單,播放視訊再截圖就行啦。 播放視訊再截圖的做法,當然可以。但是,手動截圖會太累而且無法保證準確度,特別是需要反覆提取圖片時,或者需要提取“105秒那一瞬間的美女圖片”時,或者我需要每秒出一張圖片時,那有別的辦法嗎? **本文介紹,如何使用FFmpeg實現從視訊中
即時通訊音視訊開發(八):常見的實時語音通訊編碼標準
前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(六):如何開始音訊編解碼技術的學習》 《即時通
多媒體開發(5)&音訊特徵:聲音可以調大一點嗎?
基本上,現在常用的聲音取樣辦法是pcm,而對於壓縮音訊的解碼,得到的也pcm資料。這個pcm資料,只是一堆數值,有正有負,看這個值看不出什麼花樣。 聲音採集,採的是什麼呢? 採的是聲音的強度變化,也是聲音這種能量的強弱變化,這種強弱用分貝來表示,即dB。所以,pcm資料跟這個dB就一定有關係,這個關係是這