基於FFmpeg和Qt的播放器 QtAV庫

參與項目開發: https://github.com/wang-bin/QtAV

下載編譯好的文件等:https://sourceforge.net/projects/qtav

win下編譯好的可執行文件及編譯所需的文件在這:https://sourceforge.net/projects/qtav

win下編譯要用到的庫如ffmpeg,portaudio可以在https://sourceforge.net/projects/qtav/files/depends下載



2013.05.27 QtAV1.2.0發佈:
更新很多東西,主要有
1. player例子加入gui界面,易於操控。自帶一些網絡電視
2. 獨創的播放時渲染引擎無縫動態切換。可以方便地對比各種渲染引擎的cpu使用率
3. X11下XV的支持(Qt4 only)
4. bug修復等


1.1.10還包含mac下的安裝包。linux?不需要我編譯把。
編譯了個ubuntu1204上的:http://sourceforge.net/projects/qtav/files/QtAV%201.1.11/QtAV_1.1.11_ubuntu1204_i386.deb/download
需要裝ffmpeg相關的libavcodec54等包,還要Qt。其實還是自己編譯方便。而且現在支持直接

make deb

的方式來生成deb包了,不過我對包的結果不太瞭解,可能不太規範。
命令行:
player [-vo qt|gl|d2d|gdi] [url/path]filename
 或者把player改名成player-gl, player-d2d, player-gdi也可以


我ubuntu上初始化音頻非常慢,不知是代碼問題還是系統問題。。。


2013-03015
    新增了幾個渲染方式,如opengl, direct2d, gdi。在我電腦上direct2d對性能提升非常明顯。增加了OSD(現在的設計很爛),原來的O鍵改成了切換OSD。Ctrl+O是打開文件
    切換視頻大小比例按R。
    完善了qmake的工程框架,移植了很多Qt5裏qmake內置函數到Qt4,用qmake語法寫的,支持編譯檢測。若要重新配置請刪除編譯目錄裏的.qmake.cache再qmake,mingw可能qmake一次不夠,需要兩次(還沒找到原因,我的pro寫得太複雜了)。linux下支持make deb來生成安裝包。
    支持VC(我vs2010編譯出來的無法運行,2012正常,不解),方法見github 上的wiki。支持Qt5


2013-02-28更新:

     windows下編譯所需的FFmpeg和portaudio頭文件和庫文件放在了https://sourceforge.net/projects/qtav/files/depends

    支持MinGW和MSVC編譯

    加入了幾個windows下的渲染方法,修復了些bug,等等等等

    國內外有幾個公司用到了我的項目。還有葡萄牙最古老的一所大學的一個博士在他的人機交互項目中也會使用,哈哈

2013-01-13更新:

    目前播放已經很穩定了,除了頻繁seek有時會崩潰(還不知道爲什麼)。該項目已經有國外的幾個開發者在使用了,比如有幾個意大利的開發者就用它來顯示攝像頭的實時監控視頻。我會把一些成功的案例貼在項目頁面上。

    TODO: 組件化,某些組件實現硬件加速;外部時鐘(保證無音頻流也能正常播放);更優化的數據包隊列結構;字幕;等等。。。



    很久以前就想用FFmpeg做個播放器,用Qt做gui。但是能力有限。網上大多數都是講ffplay的,ffplay代碼太長看着不舒服沒花時間看。最近有個項目要用到視頻播放功能,一開始用了phonon,用起來方便,但是有點不足,比如gui用的是QWidget的組件,我是希望用graphics framework ,自定義功能也不多。最重要的是我重裝win8後不能工作,於是決定還是自己動手寫個比較靠譜。知道原理之後發現並不難。

多線程

    其實總體思路還是比較簡單的,用3個線程(除掉主線程),一個是分離器(demuxer)的線程,它的工作就是讀取並分解音視頻流,把數據包放到音/視頻包的隊列裏。另外兩個線程就是音頻(播音頻會阻塞)和視頻解碼播放線程了,它們的工作就是讀取隊列裏的數據包進行解碼,然後輸出到窗口或音頻設備。

同步

    看到網上討論比較多的就是音視頻同步,最開始其實我很傻地根據視頻的幀率設置個timer,每隔多少個毫秒進行讀取解碼輸出,也就一個線程,這個非常不精確。後來測試了下音頻播放,發現不像視頻那樣循環得快了就播放速度變快,音頻的播放速率最後會穩定到正常速度的(還不知道爲什麼,貌似要改變音頻速率就要resample一下),怪不得別人經常說要把視頻同步到音頻。理解這點之後操作起來就非常簡單了,音頻解碼的數據包裏有個時間戳pts(有時候分離好後要處理下),播放這個包時記下這個時間戳,視頻線程要播放視頻包時時間戳和音頻的對比下,快了就wait一下,慢了就趕緊播或者丟幀,這樣處理後同步就沒問題了。很簡單,代碼也很短,效果也很好。

緩衝

     還有一個要注意的是分離線程應該分離多少數據包,因爲你讓那個線程不停地跑的話一會兒整個視頻就被讀取光了,沒必要,而且非常佔內存,而你播放的時候並不需要那麼多數據包。所以可以設置個緩衝,音視頻包隊列堆積到一定數量後就wait一下讓解碼播放線程繼續跑一會,當隊列裏的數據包比較少的時候喚醒分離線程,叫它繼續讀取點數據。這樣,可以把播放器的內存佔用降到很小。我做了個簡單的對比,用mplayer、迅雷看看還有我的播放器播放一個4G大小的視頻,那兩個播放器內存都要200多M,我的穩定在50多點,效果很明顯啊!而且對播放流暢度神馬的無影響。


    音頻播放目前用的是portaudio。windows上沒問題,linux上有點問題。不知道有沒有其他的跨平臺的庫可以播放音頻。

    播放器也剛剛開始做,目前功能還比較簡單,就是能正常播放視頻了。不能seek,不支持字幕。還有個bug,就是縮放窗口時經常崩潰,我也崩潰了,還沒找到原因。

    廢話了這麼多,最後貼上項目網址:

    https://github.com/wang-bin/QtAV

下載編譯好的文件:https://sourceforge.net/projects/qtav/

    歡迎大家共同學習交流音視頻播放的問題,也歡迎參與寫播放器



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