天天看點

視訊播放器實作技術(一)

一、知識點

ES流(Elementary Stream): 也叫基本碼流,包含視訊、音頻或資料的連續碼流.

PES流(Packet Elementary Stream): 也叫打包的基本碼流, 是将基本的碼流ES流根據需要分成長

度不等的資料包, 并加上標頭就形成了打包的基本碼流PES流.

TS流(Transport Stream): 也叫傳輸流, 是由固定長度為188位元組的包組成, 含有獨立時基的一個或

多個program, 一個program又可以包含多個視訊、音頻、和文字資訊的ES流; 每個ES流會有不同的

PID标示. 而又為了可以分析這些ES流, TS有一些固定的PID用來間隔發送program和ES流資訊的表格: PAT和PMT表.

(在MPEG-2系統中,由視訊, 音頻的ES流和輔助資料複接生成的用于實際傳輸的标準資訊流稱為MPEG-2傳送流)

封裝 : 就是捆綁打包, 将畫面視訊檔案和音軌檔案打包在一起, 并按照一定規則建立排序和索引, 便

于播放器或播放軟體來索引播放. 包括AVI \ PS(Program Stream)\ TS(Transport Stream)\ MKV(Matroska)等.

二、播放過程回放

Figure 1. 視訊播放基本處理流程

①access 通路: 無需多說, 可了解為接收、擷取、得到資料流

②demux 解複用: 把合在一起的音頻和視訊分離(還有可能的字幕)  

③decode 解碼: 包括音頻和視訊的解碼

④output 輸出: 也分為音頻和視訊的輸出(aout 和 vout)

這裡需要着重說明的是: demux 和 decode 部分

demux部分

我們都知道, 音視訊在制作的時候實際上是獨立編碼的, 得到的是分開的資料, 為了傳輸友善必須要用某種

方式合起來, 這就有了各種封裝格式. 例如, rm \ avi \ mov \ mpg 等等. 同時, 在視訊播放器上demux解

複用部分也就有了他存在意義 .

他首先解析TS流的資訊, 之後把分解出來的音頻和視訊流分别送往音頻解碼器和視訊解碼器, 進行解碼操作.

decode部分

影像在錄制後, 原始的音視訊都是占用大量空間, 而且是備援度較高的資料. 是以, 通常會在制作的時候就會進

行某種壓縮 ( 壓縮技術就是将資料中的備援資訊去除資料之間的相關性 ). 這就是我們熟知的音視訊編碼格式,

 包括MPEG1(VCD)\ MPEG2(DVD)\ MPEG4 \ H.264 等等. 音視訊解碼器的作用就是把這些壓縮了的資料還原

成原始的音視訊資料. 當然, 編碼解碼過程基本上都是有損的 .

那播放器是如何實作視訊一幀一幀的播放的呢?

一般在記憶體中将壓縮的視訊幀依次解碼出來(當然不可能把一個視訊檔案的所有壓縮資料一次性裝到記憶體中去,

而是讀出一點, 然後解碼出來一點), 然後一幀一幀送到顯示卡的顯存中就能顯示了.

如果機器性能跟得上(基本上不用考慮機器性能), 解一幀的時間小于幀與幀之間的正常間隔, 就能流暢的播放.  

每幀的播放是靠PTS來控制的, 解碼器解完每幅圖像, 都會給出該圖像的PTS, video  renderer就能按圖像的PTS

來安排顯示.

與此同時, 别忘了音頻和視訊在demux之後是獨立的,這就需要有一套機制把它們同步起來. 同時我們需要有一套機

制來控制速度、暫停、停止、跳進、 擷取各種媒體資訊、設定屬性等等 .這些也就是同步控制機制來完成的事情

(基于時間戳來搞定) .簡略來說, 就是以音頻時間為主 (聲霸卡有時間同步處理機制), 聲音圖象交錯發送

視訊解碼時, 按目前播放時間找到對應的視訊幀 (可以假設一個音頻包有N個圖象, 就在這一個音頻包完成的過

程中按幀率顯示圖象)

視訊編解碼器 : http://zh.wikipedia.org/zh-cn/%E8%A7%86%E9%A2%91%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8

視訊檔案格式 : http://zh.wikipedia.org/zh-cn/%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F

參考 : http://bbs.chinavideo.org/viewthread.php?tid=1183&extra=page%3D1

A Simple Media Player based on the FFmpeg libraries — ffplay

ffplay.c – File Reference : http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/ffplay_8c.html

ffplay.c : http://cekirdek.pardus.org.tr/~ismail/ffmpeg-dssocs/ffplay_8c-source.html