在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