在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