ES流(Elementary Stream): 也叫基本碼流,包含視頻、音頻或數(shù)據(jù)的連續(xù)碼流.
PES流(Packet Elementary Stream): 也叫打包的基本碼流, 是將基本的碼流ES流根據(jù)需要分成長(zhǎng)度不等的數(shù)據(jù)包, 并加上包頭就形成了打包的基本碼流PES流.
TS流(Transport Stream): 也叫傳輸流, 是由固定長(zhǎng)度為188字節(jié)的包組成, 含有獨(dú)立時(shí)基的一個(gè)或多個(gè)program, 一個(gè)program又可以包含多個(gè)視頻、音頻、和文字信息的ES流; 每個(gè)ES流會(huì)有不同的PID標(biāo)示. 而又為了可以分析這些ES流, TS有一些固定的PID用來(lái)間隔發(fā)送program和ES流信息的表格: PAT和PMT表.
(在MPEG-2系統(tǒng)中,由視頻, 音頻的ES流和輔助數(shù)據(jù)復(fù)接生成的用于實(shí)際傳輸?shù)臉?biāo)準(zhǔn)信息流稱為MPEG-2傳送流)
封裝 : 就是捆綁打包, 將畫(huà)面視頻文件和音軌文件打包在一起, 并按照一定規(guī)則建立排序和索引, 便于播放器或播放軟件來(lái)索引播放. 包括AVI \ PS(Program Stream)\ TS(Transport Stream)\ MKV(Matroska)等.
Figure 1. 視頻播放基本處理流程
①access 訪問(wèn): 無(wú)需多說(shuō), 可理解為接收、獲取、得到數(shù)據(jù)流
②demux 解復(fù)用: 把合在一起的音頻和視頻分離(還有可能的字幕)
③decode 解碼: 包括音頻和視頻的解碼
④output 輸出: 也分為音頻和視頻的輸出(aout 和 vout)
這里需要著重說(shuō)明的是: demux 和 decode 部分
我們都知道, 音視頻在制作的時(shí)候?qū)嶋H上是獨(dú)立編碼的, 得到的是分開(kāi)的數(shù)據(jù), 為了傳輸方便必須要用某種方式合起來(lái), 這就有了各種封裝格式. 例如, rm \ avi \ mov \ mpg 等等. 同時(shí), 在視頻播放器上demux解復(fù)用部分也就有了他存在意義 .
他首先解析TS流的信息, 之后把分解出來(lái)的音頻和視頻流分別送往音頻解碼器和視頻解碼器, 進(jìn)行解碼操作.
影像在錄制后, 原始的音視頻都是占用大量空間, 而且是冗余度較高的數(shù)據(jù). 因此, 通常會(huì)在制作的時(shí)候就會(huì)進(jìn)行某種壓縮 ( 壓縮技術(shù)就是將數(shù)據(jù)中的冗余信息去除數(shù)據(jù)之間的相關(guān)性 ). 這就是我們熟知的音視頻編碼格式, 包括MPEG1(VCD)\ MPEG2(DVD)\ MPEG4 \ H.264 等等. 音視頻解碼器的作用就是把這些壓縮了的數(shù)據(jù)還原成原始的音視頻數(shù)據(jù). 當(dāng)然, 編碼解碼過(guò)程基本上都是有損的 .
那播放器是如何實(shí)現(xiàn)視頻一幀一幀的播放的呢?
一般在內(nèi)存中將壓縮的視頻幀依次解碼出來(lái)(當(dāng)然不可能把一個(gè)視頻文件的所有壓縮數(shù)據(jù)一次性裝到內(nèi)存中去, 而是讀出一點(diǎn), 然后解碼出來(lái)一點(diǎn)), 然后一幀一幀送到顯卡的顯存中就能顯示了.
如果機(jī)器性能跟得上(基本上不用考慮機(jī)器性能), 解一幀的時(shí)間小于幀與幀之間的正常間隔, 就能流暢的播放.
每幀的播放是靠PTS來(lái)控制的, 解碼器解完每幅圖像, 都會(huì)給出該圖像的PTS, video renderer就能按圖像的PTS來(lái)安排顯示.
與此同時(shí), 別忘了音頻和視頻在demux之后是獨(dú)立的,這就需要有一套機(jī)制把它們同步起來(lái). 同時(shí)我們需要有一套機(jī)制來(lái)控制速度、暫停、停止、跳進(jìn)、 獲取各種媒體信息、設(shè)置屬性等等 .這些也就是同步控制機(jī)制來(lái)完成的事情(基于時(shí)間戳來(lái)搞定) .
簡(jiǎn)略來(lái)說(shuō), 就是
以音頻時(shí)間為主 (聲卡有時(shí)間同步處理機(jī)制), 聲音圖象交錯(cuò)發(fā)送
視頻解碼時(shí), 按當(dāng)前播放時(shí)間找到對(duì)應(yīng)的視頻幀 (可以假設(shè)一個(gè)音頻包有N個(gè)圖象, 就在這一個(gè)音頻包完成的過(guò)程中按幀率顯示圖象)
視頻編解碼器 :
視頻文件格式 :
參考 :
A Simple Media Player based on the FFmpeg libraries — ffplay
ffplay.c – File Reference :
ffplay.c :
聯(lián)系客服