音視頻流::ffplay分析

網絡

以前用過qt4+mplayer來用過一個播放器。感覺只是加個外殼,沒什麼意思。我同學還跟我說,mplayer不是那麼容易做的。

直到現在,我還記住這句話。

那時,我們一起學linux,感覺能用qt做個二次開發已經不錯。

直到現在,我真正接觸ffmpeg,sdl,OSS,OpenGL。我才感覺到,原來開發一款播放器是這麼有趣。

在這裏,我想整理一下思路,因爲確實遇到了不少問題。


播放器的一般流程(轉自網上資料)

1. 輸入 : 從文件或網絡等讀取原數據,如 x.avi, x.mov, rtsp://xxx, 對原數據進行解析,比如文件,首先要分析文件格式,從文件中取得音視頻編碼參數,視頻時間長度等信息,然後要從其中取出音頻編碼數據和視頻編碼數據送到解碼部分,這裏暫稱這種編碼源數據塊爲 packet。

2. 解碼 : 初始化時,利用輸入端從源數據中取得的信息調用不同的解碼庫初始化;然後接收輸入端傳送來的音視頻編碼數據,分別進行音頻解碼和視頻解碼,視頻解碼出來的 數據一般是 YUV 或 RGB 數據,這裏暫稱爲 picture, 音頻解碼出來的數據是採樣數據,是聲卡可以播放的數據,這裏暫稱爲 sample。 解碼所得的數據接下來送到輸出部分。

3. 輸出 : 接收解碼部分送來的 picture 和 sample 並顯示。 視頻顯示一般使用某個圖形庫,如 SDL, Xlib, DirectDraw, OpengGL, FrameBuffer等, 音頻輸出是把 sample 寫入系統的音頻驅動,由音頻驅動送入聲卡播放, 可用的音頻輸出有 ALSA, OSS, SDL, DirectSound, WaveOut等。


ffplay流程圖大概如下:

圖一

圖二


由些可見,ffplay實現方案爲
一個packet隊列,一個picture隊列
一個input(主)線程,一個decode線程,兩個output(音視頻輸出)線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章