本文來自筆者本人的語雀博客,由于語雀升級后不再滿足筆者的需求,因此之后筆者會陸續(xù)將一些之前已經(jīng)發(fā)布但尚有價(jià)值的文章搬家到CSDN。
1. 前言
作為音視頻行業(yè)從業(yè)者,怎么能不理解H.264視頻編解碼技術(shù)標(biāo)準(zhǔn)?本篇文章主要記錄筆者學(xué)習(xí)過程中對眾多優(yōu)秀博客內(nèi)容的摘抄整理,方便廣大讀者通過一篇文章即可入門了解H.264。文章可能有理解不當(dāng)或書寫錯(cuò)誤的地方,歡迎指正錯(cuò)誤和討論學(xué)習(xí),感謝閱讀本文。
2. 什么是H.264
H.264是國際標(biāo)準(zhǔn)化組織(ISO)和國際電信聯(lián)盟(ITU)共同提出的繼MPEG4之后的新一代數(shù)字視頻壓縮格式。H.264是ITU-T以H.26x系列為名稱命名的視頻編解碼技術(shù)標(biāo)準(zhǔn)之一。H.264是ITU-T的VCEG(視頻編碼專家組)和ISO/IEC的MPEG(活動圖像編碼專家組)的聯(lián)合視頻組(JVT:joint video team)開發(fā)的一個(gè)數(shù)字視頻編碼標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)最早來自于ITU-T的稱之為H.26L的項(xiàng)目的開發(fā)。H.26L這個(gè)名稱雖然不太常見,但是一直被使用著。H.264是ITU-T以H.26x系列為名稱命名的標(biāo)準(zhǔn)之一,AVC是ISO/IEC MPEG一方的稱呼。
國際上制定視頻編解碼技術(shù)的組織有兩個(gè),一個(gè)是“國際電聯(lián)(ITU-T)”,它制定的標(biāo)準(zhǔn)有H.261、H.263、H.263+等,另一個(gè)是“國際標(biāo)準(zhǔn)化組織(ISO)”它制定的標(biāo)準(zhǔn)有MPEG-1、MPEG-2、MPEG-4等。而H.264則是由兩個(gè)組織聯(lián)合組建的聯(lián)合視頻組(JVT)共同制定的新數(shù)字視頻編碼標(biāo)準(zhǔn),所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高級視頻編碼(Advanced Video Coding,AVC)的第10 部分。因此,不論是MPEG-4 AVC、MPEG-4 Part 10,還是ISO/IEC 14496-10,都是指H.264。
以上內(nèi)容來自與百度百科:H.264
T-REC-H.264-200503-S!!PDF-E中文翻譯版本.pdf
T-REC-H.264-200503-S!!PDF-E的中文翻譯版本,如果需要英文原版,可以到以下官方地址下載:
https://www.itu.int/rec/T-REC-H.264-200503-S/en
3. 什么是視頻
視頻(Video)泛指將一系列靜態(tài)影像以電信號的方式加以捕捉、記錄、處理、儲存、傳送與重現(xiàn)的各種技術(shù)。連續(xù)的圖像變化每秒超過24幀(frame)畫面以上時(shí),根據(jù)視覺暫留原理,人眼無法辨別單幅的靜態(tài)畫面;看上去是平滑連續(xù)的視覺效果,這樣連續(xù)的畫面叫做視頻。視頻技術(shù)最早是為了電視系統(tǒng)而發(fā)展,但現(xiàn)在已經(jīng)發(fā)展為各種不同的格式以利消費(fèi)者將視頻記錄下來。網(wǎng)絡(luò)技術(shù)的發(fā)達(dá)也促使視頻的紀(jì)錄片段以串流媒體的形式存在于因特網(wǎng)之上并可被電腦接收與播放。視頻與電影屬于不同的技術(shù),后者是利用照相術(shù)將動態(tài)的影像捕捉為一系列的靜態(tài)照片。
以上內(nèi)容摘抄自百度百科:視頻
(圖3 逐幀動畫演示)
git來自:手繪圖秒變動畫片,比小豬佩奇還好看!咋做的?
3.1 視頻文件封裝格式
封裝格式(也叫容器),就是將已經(jīng)編碼壓縮好的視頻軌和音頻軌按照一定的格式放到一個(gè)文件中,也就是說僅僅是一個(gè)外殼,或者把它當(dāng)成一個(gè)放視頻軌和音頻軌的文件夾也可以。說得通俗點(diǎn),視頻軌相當(dāng)于飯,而音頻軌相當(dāng)于菜,封裝格式就是一個(gè)碗,或者一個(gè)鍋,用來盛放飯菜的容器。 下面是幾種常用的視頻文件后綴類型與其相對應(yīng)的封裝格式。
視頻文件格式 | 視頻封裝格式 |
---|---|
.avi | AVI(Audio Video Interleaved) |
.wmv、.asf | WMV(Windows Media Video) |
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 | MPEG(Moving Picture Experts Group) |
.mkv | Matroska |
.rm、.rmvb | Real Video |
.mov | QuickTime File Format |
.flv | Flash Video |
3.2 視頻編碼方式
視頻編碼的作用: 將視頻像素?cái)?shù)據(jù)(RGB,YUV 等)壓縮成視頻碼流,從而降低視頻的數(shù)據(jù)量。常用的頻編碼方式有以下幾種:
名稱 | 推出機(jī)構(gòu) | 推出時(shí)間 | 目前使用領(lǐng)域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研發(fā)中 |
H.264 | MPEG/ITU-T | 2003 | 各個(gè)領(lǐng)域 |
MPEG4 | MPEG | 2001 | 不溫不火 |
MPEG2 | MPEG | 1994 | 數(shù)字電視 |
VP9 | 2013 | 研發(fā)中 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微軟平臺 |
4. 什么是視頻編解碼技術(shù)
從信息論的觀點(diǎn)來看,描述信源的數(shù)據(jù)是信息和數(shù)據(jù)冗余之和,即:數(shù)據(jù)=信息+數(shù)據(jù)冗余。數(shù)據(jù)冗余有許多種,如空間冗余、時(shí)間冗余、視覺冗余、統(tǒng)計(jì)冗余等。將圖像作為一個(gè)信源,視頻壓縮編碼的實(shí)質(zhì)是減少圖像中的冗余。
視頻壓縮編碼技術(shù)可以分為兩大類:無損壓縮和有損壓縮。
無損壓縮也稱為可逆編碼,指使用壓縮后的數(shù)據(jù)進(jìn)行重構(gòu)(即:解壓縮)時(shí),重構(gòu)后的數(shù)據(jù)與原來的數(shù)據(jù)完全相同。也就是說,解碼圖像和原始圖像嚴(yán)格相同,壓縮是完全可恢復(fù)的或無偏差的,沒有失真。無損壓縮用于要求重構(gòu)的信號與原始信號完全一致的場合,例如磁盤文件的壓縮。
有損壓縮也稱為不可逆編碼,指使用壓縮后的數(shù)據(jù)進(jìn)行重構(gòu)(即:解壓縮)時(shí),重構(gòu)后的數(shù)據(jù)與原來的數(shù)據(jù)有差異,但不影響人們對原始資料所表達(dá)的信息造成誤解。也就是說,解碼圖像和原始圖像是有差別的,允許有一定的失真,但視覺效果一般是可以接受的。有損壓縮的應(yīng)用范圍廣泛,例如視頻會議、可視電話、視頻廣播、視頻監(jiān)控等。
視頻編解碼技術(shù)的主要作用,是在可用的計(jì)算資源內(nèi),追求盡可能高的視頻重建質(zhì)量和盡可能高的壓縮比,以達(dá)到帶寬和存儲容量的要求。為何突出“重建質(zhì)量”?因?yàn)橐曨l編碼是個(gè)有損的過程,用戶只能從收到的視頻流中解析出“重建”畫面,它與原始的畫面已經(jīng)不同,例如觀看低質(zhì)量視頻時(shí)經(jīng)常會碰到的“塊”效應(yīng)。如何在一定的帶寬占用下,盡可能地保持視頻的質(zhì)量,或者在保持質(zhì)量情況下,盡可能地減少帶寬利用率,是視頻編碼的基本目標(biāo)。用專業(yè)術(shù)語來說,即視頻編解碼標(biāo)準(zhǔn)的**“率失真”性能**?!奥省笔侵复a率或者帶寬占用;“失真”是用來描述重建視頻的質(zhì)量。與編碼相對應(yīng)的是解碼或者解壓縮過程,是將接收到的或者已經(jīng)存儲在介質(zhì)上的壓縮碼流重建成視頻信號,然后在各種設(shè)備上進(jìn)行顯示。
視頻編解碼標(biāo)準(zhǔn),通常只定義上述的解碼過程。例如 H.264 / AVC 標(biāo)準(zhǔn),它定義了什么是符合標(biāo)準(zhǔn)的視頻流,對每一個(gè)比特的順序和意義都進(jìn)行了嚴(yán)格地定義,對如何使用每個(gè)比特或者幾個(gè)比特表達(dá)的信息也有精確的定義。正是這樣的嚴(yán)格和精確,保證了不同廠商的視頻相關(guān)服務(wù),可以很方便地兼容在一起,例如用 iPhone、Android Phone 或者 windows PC 都可以觀看同一在線視頻網(wǎng)站的同一視頻。世界上有多個(gè)組織進(jìn)行視頻編碼標(biāo)準(zhǔn)的制定工作,國際標(biāo)準(zhǔn)組織 ISO 的 MPEG 小組、國際電信聯(lián)盟 ITU-T 的 VCEG 小組、中國的 AVS 工作組、Google 及各大廠商組成的開放媒體聯(lián)盟等。
(圖1 視頻編碼標(biāo)準(zhǔn)及發(fā)展歷史)
自 VCEG 制定 H.120標(biāo)準(zhǔn)開始,視頻編碼技術(shù)不斷發(fā)展,先后成功地制定了一系列滿足不同應(yīng)用場景的視頻編碼標(biāo)準(zhǔn),如圖1所示。VCEG 組織先后制定了H.120、H.261、H.262(MPEG-2 Part 2)、H.263、H.263+、H.263++。MPEG也先后制定了MPEG-1、MPEG-2、MPEG-4 Part 2。以及兩個(gè)國際組織合作制定的H.264/AVC、H.265/HEVC、H.266/VVC;中國自主知識產(chǎn)權(quán)的 AVS、AVS2、AVS3 視頻編碼標(biāo)準(zhǔn);Google 制定的 VP8、VP9;Google、思科、微軟、蘋果等公司組成的開放媒體聯(lián)盟(AOM)制定的 AV1。
H.264/AVC雖有近20年歷史,但它優(yōu)秀的壓縮性能、適當(dāng)?shù)倪\(yùn)算復(fù)雜度、優(yōu)秀的開源社區(qū)支持、友好的專利政策、強(qiáng)大的生態(tài)圈等多個(gè)方面的因素,依舊讓它保持著強(qiáng)大的生命力,特別是在實(shí)時(shí)通信領(lǐng)域。像 ZOOM、思科 Webex 等視頻會議產(chǎn)品和基于 WebRTC SDK 的視頻服務(wù),大多數(shù)主流場景都采用 H.264/AVC。
5. H.264視頻編解碼技術(shù)的意義
H.264或稱為MPEG-4第十部分(高級視頻編碼部分)是由ITU-T和ISO/IEC再次聯(lián)手開發(fā)的最新一代視頻編碼標(biāo)準(zhǔn)。由于它比以前的標(biāo)準(zhǔn)在設(shè)計(jì)結(jié)構(gòu)、實(shí)現(xiàn)功能上作了進(jìn)一步改進(jìn),使得在同等視頻質(zhì)量條件下,能夠節(jié)省50%的碼率,且提高了視頻傳輸質(zhì)量的可控性,并具有較強(qiáng)的差錯(cuò)處理能力,適用范圍更廣。在低碼率情況下,32kbps的H.264圖像質(zhì)量相當(dāng)于128kbps的MPEG-4圖像質(zhì)量。H.264可應(yīng)用于網(wǎng)絡(luò)電視、廣播電視、數(shù)字影院、遠(yuǎn)程教育、會議電視等多個(gè)行業(yè)。
H.264最大的優(yōu)勢是具有很高的數(shù)據(jù)壓縮比率,在同等圖像質(zhì)量的條件下,H.264的壓縮比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。舉個(gè)例子,原始文件的大小如果為88GB,采用MPEG-2壓縮標(biāo)準(zhǔn)壓縮后變成3.5GB,壓縮比為25∶1,而采用H.264壓縮標(biāo)準(zhǔn)壓縮后變?yōu)?79MB,從88GB到879MB,H.264的壓縮比達(dá)到驚人的102∶1。低碼率(Low Bit Rate)對H.264的高的壓縮比起到了重要的作用,和MPEG-2和MPEG-4 ASP等壓縮技術(shù)相比,H.264壓縮技術(shù)將大大節(jié)省用戶的下載時(shí)間和數(shù)據(jù)流量收費(fèi)。尤其值得一提的是,H.264在具有高壓縮比的同時(shí)還擁有高質(zhì)量流暢的圖像,正因?yàn)槿绱耍?jīng)過H.264壓縮的視頻數(shù)據(jù),在網(wǎng)絡(luò)傳輸過程中所需要的帶寬更少,也更加經(jīng)濟(jì)。
因此,H.264的出現(xiàn)就是為了創(chuàng)建比以前的視頻壓縮標(biāo)準(zhǔn)更高效的壓縮標(biāo)準(zhǔn),使用更好高效的視頻壓縮算法來壓縮視頻的占用空間,提高存儲和傳輸?shù)男?,在獲得有效的壓縮效果的同時(shí),使得壓縮過程引起的失真最小。
(圖2 H264視頻編碼發(fā)展歷程)
圖來自音視頻系列–H264編解碼總結(jié)
6. 視頻編解碼技術(shù)在音視頻處理流程中的應(yīng)用
視頻編解碼在音視頻處理流程中的應(yīng)用如下圖4和圖5所示:
(圖4 音視頻錄制)(圖5 音視頻播放)
圖4和圖5來自:音視頻基礎(chǔ)
音視頻處理的一般流程為:數(shù)據(jù)采集→數(shù)據(jù)編碼→數(shù)據(jù)傳輸(流媒體服務(wù)器) →解碼數(shù)據(jù)→播放顯示
- 數(shù)據(jù)采集:攝像機(jī)及拾音器收集視頻及音頻數(shù)據(jù),此時(shí)得到的為原始數(shù)據(jù)涉及技術(shù)或協(xié)議:攝像機(jī):CCD、CMOS拾音器:聲電轉(zhuǎn)換裝置(咪頭)、音頻放大電路。
- 數(shù)據(jù)編碼:使用相關(guān)硬件或軟件對音視頻原始數(shù)據(jù)進(jìn)行編碼處理(數(shù)字化)及加工(如音視頻混合、打包封裝等),得到可用的音視頻數(shù)據(jù)涉及技術(shù)或協(xié)議:編碼方式:CBR、VBR編碼格式視頻:H.265、H.264、MPEG-4等,封裝容器有TS、MKV、AVI、MP4等音頻:G.711μ、AAC、Opus等,封裝有MP3、OGG、AAC等。
-
數(shù)據(jù)傳輸:將編碼完成后的音視頻數(shù)據(jù)進(jìn)行傳輸,早期的音視頻通過同軸電纜之類的線纜進(jìn)行傳輸,IP網(wǎng)絡(luò)發(fā)展后,使用IP網(wǎng)絡(luò)傳輸涉及技術(shù)或協(xié)議:傳輸協(xié)議:RTP與RTCP、RTSP、RTMP、HTTP、HLS(HTTPLive
Streaming)等,控制信令:SIP和SDP、SNMP等 - 解碼數(shù)據(jù):使用相關(guān)硬件或軟件對接收到的編碼后的音視頻數(shù)據(jù)進(jìn)行解碼,得到可以直接顯示的圖像/聲音涉及技術(shù)或協(xié)議:一般對應(yīng)的編碼器都會帶有相應(yīng)的解碼器,也有一些第三方解碼插件等。
- 播放顯示:在顯示器(電視、監(jiān)視屏等)或揚(yáng)聲器(耳機(jī)、喇叭等)里,顯示相應(yīng)的圖像畫面或聲音涉及技術(shù)或協(xié)議:顯示器、揚(yáng)聲器、3D眼鏡等。
7. H.264基本流結(jié)構(gòu)
H.264 的基本流(elementary stream,ES)的結(jié)構(gòu)分為兩層:
視頻編碼層(VCL)和網(wǎng)絡(luò)適配層(NAL)。
視頻編碼層負(fù)責(zé)高效的視頻內(nèi)容表示,而網(wǎng)絡(luò)適配層負(fù)責(zé)以網(wǎng)絡(luò)所要求的恰當(dāng)?shù)姆绞綄?shù)據(jù)進(jìn)行打包和傳送。
引入NAL并使之與VCL分離帶來的好處包括兩方面:
1、使信號處理和網(wǎng)絡(luò)傳輸分離,VCL 和NAL 可以在不同的處理平臺上實(shí)現(xiàn);
2、VCL 和NAL 分離設(shè)計(jì),使得在不同的網(wǎng)絡(luò)環(huán)境內(nèi),網(wǎng)關(guān)不需要因?yàn)榫W(wǎng)絡(luò)環(huán)境不同而對VCL比特流進(jìn)行重構(gòu)和重編碼。
VCL(Video Coding Layer):VCL是對核心算法引擎,塊,宏塊及片的語法級別的定義,他最終輸出編碼完的數(shù)據(jù) SODB。
NAL(Net Abstraction Layer):NAL將SODB打包成RBSP然后加上NAL頭,組成一個(gè)NALU(NAL單元)。
SODB(String Of Data Bits):原始數(shù)據(jù)比特流, 長度不一定是8的倍數(shù),故需要補(bǔ)齊。
RBSP(Raw Byte Sequence Payload):原始數(shù)據(jù)字節(jié)流,SODB+RBSP trailing bits=RBSP,添加加trailing bits是為了使一個(gè)RBSP為整字節(jié)數(shù)。
H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )組成,不同的NALU數(shù)據(jù)量各不相同。H.264 草案指出,當(dāng)數(shù)據(jù)流是儲存在介質(zhì)上時(shí),在每個(gè)NALU 前添加起始碼:0x000001或0x00000001,用來指示一個(gè)NALU 的起始和終止位置。在這樣的機(jī)制下,在碼流中檢測起始碼,作為一個(gè)NALU得起始標(biāo)識,當(dāng)檢測到下一個(gè)起始碼時(shí),當(dāng)前NALU結(jié)束。
H.264 碼流中每個(gè)幀的開頭的3~4個(gè)字節(jié)是H.264 的start_code(起始碼),0x00000001或0x000001。3字節(jié)的0x000001只有一種場合下使用,就是一個(gè)完整的幀被編為多個(gè)slice(片)的時(shí)候,從第二個(gè)slice開始,包含這些slice的NALU 使用3字節(jié)起始碼。也就是說,如果NALU對應(yīng)的slice為一幀的開始就用0x00000001,否則就用0x000001。
本段摘抄自草上爬的H.264格式分析
7.1 VCL層中的結(jié)構(gòu)
常見的I、B、P幀組成圖像序列sequence,這里I幀和IDR幀的區(qū)別參考:H.264—(I、P、B幀)(I幀和IDR幀)(DTS和PTS、time_base),一幀圖片中可以有一個(gè)多個(gè)Slice,一個(gè)Slice有多個(gè)宏塊(Macro BLock) ,一個(gè)宏塊包含一個(gè)亮度塊和兩個(gè)色度塊。
SODB :數(shù)據(jù)比特串 ---->最原始的編碼數(shù)據(jù),即VCL數(shù)據(jù).
7.2 NAL層中的結(jié)構(gòu)
一個(gè)典型的NALU如下圖所示
3.1 NAL頭介紹
占一個(gè)字節(jié),由三部分組成forbidden_bit(1bit),nal_reference_bit(2bits)(優(yōu)先級),nal_unit_type(5bits)(類型)。
forbidden_bit:
禁止位,默認(rèn)為0,1為語法有錯(cuò)誤。
nal_reference_bit:
用于在重構(gòu)過程中標(biāo)記一個(gè)NAL單元的重要性,值越大,越重要。值為0表示這個(gè)NAL單元沒有用于預(yù)測,因此可被解碼器拋棄而不會有錯(cuò)誤擴(kuò)散;值高于0表示此NAL單元要用于無漂移重構(gòu),且值越高,對此NAL單元丟失的影響越大。
nal_unit_type :NAL類型。參見下表:
3.2 RBSP、EBSP
SODB 數(shù)據(jù)比特串:最原始的編碼數(shù)據(jù)。
RBSP 原始字節(jié)序列載荷:在SODB的后面添加了結(jié)尾比特(RBSP trailing bits 一個(gè)bit“1”)若干比特“0”,以便字節(jié)對齊。
EBSP 擴(kuò)展字節(jié)序列載荷:在RBSP基礎(chǔ)上填加了仿校驗(yàn)字節(jié)(0X03)它的原因是: 在NALU加到Annexb上時(shí),需要填加每組NALU之前的開始碼 StartCodePrefix,如果該NALU對應(yīng)的slice為一幀的開始則用4位字節(jié)表示,ox00000001,否則用3位字節(jié)表示 ox000001。為了使NALU主體中不包括與開始碼相沖突的,在編碼時(shí),每遇到兩個(gè)字節(jié)連續(xù)為0,就插入一個(gè)字節(jié)的0x03。解碼時(shí)將0x03去掉。
附:碼流分析工具
1.CodecVisa(跨平臺:H264/H265…) http://www.codecian.com/downloads.html
2.H264BSAnalyzer(H264/H265) https://github.com/latelee/H264BSAnalyzer
3.GitlHEVCAnalyzer(H264) https://github.com/lheric/GitlHEVCAnalyzer
4.Elecard HEVC/AVC Analyzer(收費(fèi)) https://www.elecard.com/products/video-analysis/streameye-studio 5.VideoEye(H264/RTMP…) https://github.com/leixiaohua1020/VideoEye
文章來源:http://www.zghlxwxcb.cn/news/detail-406277.html
參考資料
深入淺出理解視頻編解碼技術(shù)
音視頻系列–H264編解碼總結(jié)
直播系統(tǒng)搭建:音視頻處理的一般流程與推流端的四個(gè)環(huán)節(jié)
H.264—碼流格式分析文章來源地址http://www.zghlxwxcb.cn/news/detail-406277.html
到了這里,關(guān)于Android 音視頻開發(fā)實(shí)踐系列-06-初步了解H.264視頻編解碼技術(shù)標(biāo)準(zhǔn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!