linux下QT,FFMPEG, SDL2製作簡易播放器

在Ubuntu環境下使用QT做界面,ffmpeg解碼視頻,SDL播放音樂,製作一個簡易的視頻播放器。

該視頻播放器的主要運行三條線程,需要兩條隊列:

線程1(音視頻數據分離):使用FFMPEG分解視頻文件,將視頻數據存入到視頻隊列中,將音頻數據存入到音頻隊列中。

線程2(視頻解碼):從視頻隊列中獲取一包視頻數據,通過FFMPEG解碼該包視頻數據,解碼後再將視頻轉換爲RGB數據,最後通過QT的畫圖顯示將視頻畫面顯示出來。

線程3(音頻解碼):實際該線程由SDL新建,它是通過回調的方式來從音頻隊列中獲取音頻數據,由SDL解碼後再進行聲音的播放。


注意點:

(一)音視頻的同步:
    每次進行圖片獲取的時候,都需要與音頻播放的PTS時間做對比,如果視頻播放的pts太快,那麼久需要延時等待音頻的播放,這樣就可以實現音視頻的同步。

(二)拖動播放進度條;
    當發生拖動的時候,獲取拖動到的位置,然後再根據視頻文件總的時間來計算拖動點在文件的位置,然後可以通過FFMPEG來查找拖動點附近最近的一個視頻關鍵幀,進而從該關鍵幀點開始播放視頻。
    

實際運行效果如下:


說明:

本人測試開發環境和安裝軟件版本如下:

linux: Ubuntu16.04
FFMPEG: ffmpeg-4.1.3
SDL: SDL2-2.0.9
lame: lame-3.100
x264: x264-snapshot-20190610-2245
QT: qt-opensource-linux-x64-5.9.0.run

版權說明:源代碼從葉海輝中獲取 http://blog.yundiantech.com/

修改說明:
    (1)在源碼的基礎上,添加了代碼註釋和說明,供新手參考,也給自己做一個學習備忘記錄。
    (2)源碼是在Windows下跑的,FFMPEG和SDL庫也是Windows的庫,我將這些庫修改爲了適合ubuntu16.04使用的linux庫。
    

代碼結構如下:

biao@ubuntu:~/QT/MediaPlay/VideoPlayer_5$ 
biao@ubuntu:~/QT/MediaPlay/VideoPlayer_5$ tree
.
├── src
│   ├── main.cpp
│   ├── mainwindow.cpp
│   ├── mainwindow.h
│   ├── mainwindow.ui
│   └── videoplayer
│       ├── videoplayer.cpp
│       └── videoplayer.h
├── VideoPlayer_5.pro
└── VideoPlayer_5.pro.user

2 directories, 8 files
biao@ubuntu:~/QT/MediaPlay/VideoPlayer_5$ 


修改後工程下載路徑:mediapaly.rar



 

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