天天看點

FFmpeg簡易播放器的實作4-音視訊播放

作者: 葉餘 來源: https://www.cnblogs.com/leisure_chn/p/10235926.html

基于 FFmpeg 和 SDL 實作的簡易視訊播放器,主要分為讀取視訊檔案解碼和調用 SDL 播放兩大部分。

前面三個實驗分别實作了最簡播放、視訊播放和音頻播放,本次實驗将視訊播放和音頻播放結合在一起。

FFmpeg 簡易播放器系列文章如下:

[1].

FFmpeg簡易播放器的實作1-最簡版 [2]. FFmpeg簡易播放器的實作2-視訊播放 [3]. FFmpeg簡易播放器的實作3-音頻播放 [4]. FFmpeg簡易播放器的實作4-音視訊播放 [5]. FFmpeg簡易播放器的實作5-音視訊同步

1. 視訊播放器基本原理

下圖引用自 “

雷霄骅,視音頻編解碼技術零基礎學習方法

”,因原圖太小,看不太清楚,故重新制作了一張圖檔。

FFmpeg簡易播放器的實作4-音視訊播放

如下内容引用自 “

”:

解協定

将流媒體協定的資料,解析為标準的相應的封裝格式資料。視音頻在網絡上傳播的時候,常常采用各種流媒體協定,例如 HTTP,RTMP,或是 MMS 等等。這些協定在傳輸視音頻資料的同時,也會傳輸一些信令資料。這些信令資料包括對播放的控制(播放,暫停,停止),或者對網絡狀态的描述等。解協定的過程中會去除掉信令資料而隻保留視音頻資料。例如,采用 RTMP 協定傳輸的資料,經過解協定操作後,輸出 FLV 格式的資料。

解封裝

将輸入的封裝格式的資料,分離成為音頻流壓縮編碼資料和視訊流壓縮編碼資料。封裝格式種類很多,例如 MP4,MKV,RMVB,TS,FLV,AVI 等等,它的作用就是将已經壓縮編碼的視訊資料和音頻資料按照一定的格式放到一起。例如,FLV 格式的資料,經過解封裝操作後,輸出 H.264 編碼的視訊碼流和 AAC 編碼的音頻碼流。

解碼

将視訊/音頻壓縮編碼資料,解碼成為非壓縮的視訊/音頻原始資料。音頻的壓縮編碼标準包含 AAC,MP3,AC-3 等等,視訊的壓縮編碼标準則包含 H.264,MPEG2,VC-1 等等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視訊資料輸出成為非壓縮的顔色資料,例如 YUV420P,RGB 等等;壓縮編碼的音頻資料輸出成為非壓縮的音頻抽樣資料,例如 PCM 資料。

音視訊同步

根據解封裝子產品處理過程中擷取到的參數資訊,同步解碼出來的視訊和音頻資料,并将視訊音頻資料送至系統的顯示卡和聲霸卡播放出來。

2. 簡易播放器的實作-音視訊播放

2.1 實驗平台

實驗平台:  openSUSE Leap 42.3  
FFmpeg版本:4.1  
SDL版本:   2.0.9      

FFmpeg 開發環境搭建可參考 “

FFmpeg開發環境建構

2.2 源碼清單

使用如下指令下載下傳源碼:

svn checkout https://github.com/leichn/exercises/trunk/source/ffmpeg/player_avideo      

2.3 源碼流程分析

參考如下:

FFmpeg簡易播放器的實作4-音視訊播放

2.4 解複用線程

解複用線程就是 main() 函數所在的主線程。main() 函數作一些必要的初始化工作後,建立音頻處理線程和視訊處理線程。

然後 main() 函數進入主循環,從輸入檔案中讀取 packet,并根據 packet 類型,将之放入視訊 packet 隊列或音頻 packet 隊列。

2.5 音頻處理線程

音頻處理線程是 SDL 庫内建線程。使用者提供回調函數供音頻處理線程調用。實作過程參考 “

2.6 視訊處理線程

視訊處理線程實作視訊解碼及播放。實作過程參考 “

3. 編譯與驗證

3.1 編譯

在源碼目錄運作:

./compiler.sh      

3.2 驗證

選用 clock.avi 測試檔案,測試檔案下載下傳(右鍵另存為):

clock.avi

檢視視訊檔案格式資訊:

ffprobe clock.avi      

列印視訊檔案資訊如下:

[avi @ 0x9286c0] non-interleaved AVI
Input #0, avi, from 'clock.avi':
  Duration: 00:00:12.00, start: 0.000000, bitrate: 42 kb/s
    Stream #0:0: Video: msrle ([1][0][0][0] / 0x0001), pal8, 320x320, 1 fps, 1 tbr, 1 tbn, 1 tbc
    Stream #0:1: Audio: truespeech ([34][0][0][0] / 0x0022), 8000 Hz, mono, s16, 8 kb/s      

運作測試指令:

./ffplayer clock.avi      

可以聽到每隔 1 秒播放一次“嘀”聲,聲音播放 12 次。時針每隔 1 秒跳動一格,跳動 12 次。聲音播放正常,畫面播放也正常,但是聲音和畫面不能對應,因為沒有考慮音視訊同步。下一次實驗研究音視訊同步問題。

4. 參考資料

[1] 雷霄骅,

視音頻編解碼技術零基礎學習方法

[2] 雷霄骅,

最簡單的基于FFMPEG+SDL的視訊播放器ver2(采用SDL2.0)

[3] SDL WIKI,

https://wiki.libsdl.org/

[4] Martin Bohme,

An ffmpeg and SDL Tutorial, Tutorial 03: Playing Sound

5. 修改記錄

2018-12-06 V1.0 初稿

「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
FFmpeg簡易播放器的實作4-音視訊播放

繼續閱讀