最近在研究基於移動端平臺上使用視頻作動畫載體的方案,目前移動端平臺使用動畫的方案有:gif圖、apng、webp、lottie、svga等,各有各的優點,也有相應的劣勢,而使用視頻作動畫的目的,尋求的是完美還原設計師的設計特效外,同時性能達到極致。html
在這個過程當中,也積累了一些視頻相關的知識,藉此同你們分享下。web
談到視頻,咱們常常會聽到視頻編解碼、H.264
等諸如此類的內容。那麼視頻編解碼是什麼意思呢?算法
視頻編解碼,其實就是對視頻數據進行壓縮和解壓縮的過程,而在討論到編解碼時,又常常同H.264
聯繫到一塊兒,那麼H.264
又是什麼?windows
H.264
是一種視頻壓縮標準,簡稱AVG
,一種被普遍使用的高精度視頻的錄製、壓縮和發佈格式。該標準引入了一系列新的可以大大提升壓縮性能的技術,並可以同時在高碼率端和低碼率端大大超越之前的諸標準,能夠說是一種壓縮算法,但又不只僅止步於此。markdown
H.264
是H.26X
系列中的一種,目前最新是H.265
,簡稱HEVC
,在一樣的畫面質量下,後者的壓縮率是前者兩倍(比特率減小50%),是將來發展趨勢,iOS上的Video ToolBox
目前可支持H.265
的編解碼。網絡
視頻編碼還有其餘的標準,好比AMV
、AVS
等等,但主流基本是H.26X
系列。ide
H.264
是視頻的原始碼流,分爲兩層,分別是視頻編碼層(VCL)和網絡提取層(NAL),前者是H.264
編碼/壓縮的核心,主要負責將視頻數據編碼/壓縮,再切分,後者負責格式化VCL數據並提供頭信息,以保證數據適合各類信道和存儲介質的傳輸,基本單位是NALU
。svg
經過上圖能夠看到,一個視頻幀包含了一個或多個NALU
,開頭通常是SPS
和PPS
,這兩個主要是用於初始化解碼器所須要的參數信息,也是解碼的關鍵,接下去就是I/P/B幀等NALU數據,而NALU
細分下去還有切片、宏等單位,這裏因爲篇幅緣由就不在展開述論。工具
在視頻的編解碼中,常常會討論到幾個很關鍵的名詞,如I
幀、P
幀、B
幀等。接下來從編碼和解碼角度來理解它們。oop
從編碼角度上來講:
I
幀:幀內編碼幀, I幀一般是每一個GOP
(MPEG所使用的一種視頻壓縮技術)的第一個幀,通過適度地壓縮,做爲隨機訪問的參考點,能夠當成靜態圖像,I
幀壓縮掉視頻的空間冗餘信息;P
幀:前向預測編碼幀,經過將圖像序列中前面已編碼幀的時間冗餘信息充分去除來壓縮傳輸數據量的編碼圖像;B
幀:雙向預測內插編碼幀,既考慮源圖像序列前面的已編碼幀,又顧及源圖像序列後面的已編碼幀之間的時間冗餘信息,來壓縮傳輸數據量的編碼圖像。從解碼角度上來講:
I
幀自身能夠經過視頻解壓算法解壓成一張單獨的完整視頻畫面,因此I
幀去掉的是視頻幀在空間維度上的冗餘信息;P
幀須要參考其前面的一個I
幀或者P
幀來解碼成一張完整的視頻畫面;B
幀則須要參考其前一個I
幀或者P
幀及其後面的一個P幀來生成一張完整的視頻畫面,因此P
幀與B
幀去掉的是視頻幀在時間維度上的冗餘信息。除次以外,還有PTS
、DTS
、GOP
。
PTS
是用來描述視頻解碼階段的幀輸出順序,DTS
用來描述視頻解碼階段的幀解碼順序,在無B
幀的狀況下,PTS
等於DTS
,在有B
幀的狀況下,輸出順序須要參考PTS
。
而GOP
,描述的是兩個I
幀之間造成的一組圖片。
MP4
是咱們常見的視頻資源,但MP4的本質又是什麼呢?和H.264
有什麼不可告人的祕密呢?
MP4也叫MPEG-4,是一種多媒體容器格式,後綴是.mp4,其容器格式借鑑了Apple
的QuickTime
的組織方式,即以一系列BOX
爲基本單位。
MP4文件由若干個box
組成,box
的示意圖如上圖所示:
box
由header
和body
組成,header
指明瞭box
的size
和type
;size
包含了box
的header
和body
整個大小;若是size
爲1,表示box
的長度須要用更多的bits位來描述,能夠經過一個64bits位的largesize來描述box
的長度,若是size
爲0,表示該box
爲文件的最後一個box
;type
,一般使用4個ASCII碼的字符如"ftyp"、"moov"等表示,這些box type
是已經預約義好的,表示固定的含義,若是是"uuid",表示該box
爲用戶自定義拓展的類型,若是box type
是未定義的,應將其忽略;box
中能夠包含box
,這種box
叫作container box
;box
分爲兩種,Box
和Fullbox
,FullBox
是Box
的拓展,header
中增長了8位的version
和24位的flags
字段。mp4box.js
:一個在線解析mp4的工具。bento4
:包含mp4dump、mp4edit、mp4encrypt等工具。MP4Box
:相似於bento4,包含很全面的工具。mp4info.exe
: windows平臺圖形界面展現mp4基本信息的工具。咱們使用mp4box.js
,能夠看到MP4文件由許多box組成,每一個box包含不一樣的信息,以樹形的方式組織,主要的box以下:
經過上表,咱們能夠看到有4個樹節點:
ftyp
簡單的說就是爲了標識它的developer是誰,兼容哪些標準等,如「mp42」表示它的major brand是MP4 v2,而「mp42」和「mp41」則表示它的compatible brands是MP4 v2和MP4 v1。
包含了文件媒體的metadata信息,是一個container box,通常在ftyp後面。moov
包含1個mvhd和若干個trak,其中mvhd是header box,做爲第一個子box出現,trak包含一個trakc的相關信息,是一個container box。
mvhd
(Movie Header Box),主要存放着視頻文件的meta data,其中的time scale和 duration對文件的播放有着重要做用
Media Boxyeshi
也是一個container box,其定義了track媒體類型以及smaple數據,描述sample的信息。 mdia包含:
mdhd
和tkhd內容上大體一致,不過tkhd一般是指定的track設定的相關屬性和內容,而mdhd
是針對獨立的media來設置的,字段包含
hdlr
解釋了媒體的播放過程信息,可獲取track
類型信息,主要是有字段handler_type(uint32_t)
區分,具體含義以下:
重要的容器box,存儲瞭解釋track媒體數據的handler-specific信息,media handler用這些信息將媒體時間映射到媒體數據並行處理,minf
是一個container box,其實際內容由子box說明。 通常狀況下,minf包含了一個header box,一個dinf和一個stbl,其中header box的數據類型有vmhd(視頻軌)、smhd(音軌)、hmhd(hint track)、nmhd(null track),dinf爲data information box,stbl爲sample table box。
stbl
包含了關於track中sample全部時間和位置的信息,以及sample的編解碼等信息。利用這個表,能夠解釋sample的時序、類型、大小以及在各自存儲容器中的位置。stbl
是MP4文件中最複雜的一個box了,也是解開MP4文件格式的主幹,是一個container box;
stbl
包含:
在mp4文件中,sample是一個媒體流的基本單元,例如視頻流的一個sample表明實際的nal數據。chunk是數據存儲的基本單位,它是一系列sample數據的集合,一個chunk中能夠包含一個或多的sample。
存儲了編碼類型和初始化解碼器須要的信息。 stsd
有多種類型的子box,具體取決於該track是視頻或是音頻或是其餘,對於視頻,如果經過使用了H.264
編碼的,子box爲avc1,avc1的主要字段:
包含一個Sample編碼時序表,經過這個表能夠從解碼時間映射到sample序號,表中的每一項是連續相同的編碼時間增量(Decode Delta)的個數和編碼時間增量,經過把時間增量累加就能夠創建一個完整的time to sample表。
這個box提供了decoding time到composition time的offset的表,用於計算pts。
stts
表可獲取;ctts
獲取。由此可知,經過stts
和ctts
能夠方向推出解碼順序和視頻播放順序,當無B
幀視頻時,ctts
不存在,解碼順序和播放順序一致。
它包含media中的關鍵幀的sample表,若是此表不存在,則每一幀都是關鍵幀。
主要字段sample_number:媒體流中同步的sample序號。
包含sample的數量和每一個sample的字節大小,box體積有點大,主要字段有:
meida中的sample被分組成chunk,chunk能夠有不一樣的大小,chunk內的sample能夠有不一樣的大小,經過stsc中的sample-chunk映射表能夠找到指定的smaple的chunk,從而找到這個sample。結構相同的chunk能夠彙集在一塊兒造成一個entry,這個entry就是一個stsc映射表的表項。
主要字段說明:
chunk的編號從1開始。
Chunk Offset表存儲了每一個thunk在文件中的位置,這樣就能夠找到媒體數據,而不用解析box了。
感謝您閱讀到這裏,本次分享的內容只是視頻方面的基礎,過程有些枯燥,如如有什麼描述不對或不得當,歡迎指出。