我們首先來(lái)講講流媒體的封裝格式,如MP4,FLV,常見(jiàn)的廣電流媒體如TS格式。
再如常見(jiàn)的流媒體文本格式為M3U8,其內(nèi)部就是封裝的TS片格式。真正播放器解析的,也是其內(nèi)部的TS片。
以上說(shuō)的這是,都是流媒體的封裝格式。? 那我們常說(shuō)的H264、H265是什么呢?這個(gè)是編碼格式。
編碼格式的意思就是,將流媒體的內(nèi)容進(jìn)行壓縮所用到的算法。比如視頻壓縮,常用的H264編碼,就是用H264算法進(jìn)行壓縮大小。音頻就是用ACC算法進(jìn)行壓縮。
?一部片源,我們解碼的時(shí)候,首先通過(guò)封裝格式的格式頭,去找到一些信息。?然后就進(jìn)行每一個(gè)視頻編碼幀與音頻編碼幀的解析,這個(gè)過(guò)程是兩個(gè)線程去處理,一個(gè)處理視頻,一個(gè)處理音頻。最后音視頻同步來(lái)呈現(xiàn)最終的結(jié)果。如下圖:

?可以看到,視頻編碼幀通過(guò)H264解碼出來(lái)的是YUV格式,一般為YUV420或者YUV420P。再轉(zhuǎn)成RGB進(jìn)行顯示。?這個(gè)是解碼過(guò)程。編碼過(guò)程就剛好相反,手機(jī)采集的視頻信息最初為NV21,轉(zhuǎn)再碼為YUV格式,再通過(guò)H264來(lái)進(jìn)行編碼。? 音頻文件也是相同的邏輯,片源的解碼用aac算法解碼成PCM原始音頻,再進(jìn)行播放,編碼過(guò)程則相反。
下圖為YUV數(shù)據(jù)對(duì)比圖

以下是YVU與RGB的公式的轉(zhuǎn)換。ffmpeg中已經(jīng)有了這些公式的接口。


GOP即Group of picture(圖像組),指兩個(gè)I幀之間的距離。GOP可以理解為一個(gè)視頻段。里面包含了這個(gè)視頻段的完整信息。先講講IPB幀。
I幀為關(guān)鍵幀,包含了幀的完整信息,P幀為預(yù)測(cè)編碼圖像幀,就是說(shuō)這一幀的信息是跟他前一幀的信息有關(guān),若前一幀信息丟失,則P幀信息就會(huì)出問(wèn)題。B幀為雙向預(yù)測(cè)編碼圖像幀,跟前后的幀都有關(guān)系,所以說(shuō)B幀的壓縮是最高的,本身的信息都分散到了前后。
我們先看看圖中的解碼順序,這里先解出了I幀,隨后的兩個(gè)B幀都需要前后信息,到第4個(gè)P幀的時(shí)候,需要前一幀信息,注意,這里的前一幀,是指的前一個(gè)已經(jīng)解析出的最近的幀,故這里指的是I幀而不是B幀。?到第4個(gè)P幀解碼完成后,再開(kāi)始解析第2個(gè)B幀,此時(shí)的后一幀,也不是指第3個(gè)B幀,而是指離的最近的已經(jīng)解析出的P幀,故解碼順序?yàn)?342.?
可以看出,B幀跟后面的一幀是有關(guān)系的。這意味著,幀的播放順序和解析順序并不一致。因此,在現(xiàn)實(shí)的播放流程中,總是需要先緩沖一部份幀,才能流暢的播放。
DTS:Decode Time Stamp,解碼時(shí)間戳
PTS:Presentation Time Stamp ,展示時(shí)間戳
可以看出,DTS跟解碼順序是一樣的,PTS其實(shí)就是幀的排列順序,當(dāng)沒(méi)有B幀時(shí),這兩時(shí)間戳的值是完全一樣的。?
DTS的作用在,主要是標(biāo)識(shí)讀入內(nèi)存中的bit流在什么時(shí)候開(kāi)始送入解碼器中進(jìn)行解碼。?
PTS作用于在音視頻同步的時(shí)候采用。