转载原文----:https://www.cnblogs.com/QingHuan/p/8830562.html
下面是一张自己做的图,对QT可调用的几种播放方面的开源库进行对比
Stage1:QT原生播放方式:QT QMediaPlayer
这种方式有两个优点:
- 无需额外的库,直接可以使用且实现方式简单,已经有大量的例子
- CPU占用率低,主要使用GPU
缺点:
- 支持的视频格式少,跟具体运行在哪个操作系统上有关。在Windows上需要安装LAVFilter等解码器才能支持很多的播放格式
- 无法打开非HTTP格式开头的直播流链接
- 代码示例
QWidget wi;
QMediaPlayer* player = new QMediaPlayer(0, QMediaPlayer::VideoSurface);
QVideoWidget* vw = new QVideoWidget;
QVBoxLayout* lay = new QVBoxLayout;
lay->addWidget(vw);
vw->setMinimumSize(400, 300);
lay->setSizeConstraint(QLayout::SetMinimumSize);
wi.setLayout(lay);player->setVideoOutput(vw);
QNetworkRequest req(QUrl("http://pull-g.kktv8.com/livekktv/100987038.flv"));
QMediaContent c(req);
player->setMedia(c);
player->play();
Stage2:使用OpenCV进行播放
优点:
- 支持的播放格式多
- 相应的示例程序多
缺点:
- 虽然底层调用的也是ffmpeg的库,但是OpenCV是将收到的直播流转换成了一张一张的图片,然后再一张一张的图片按顺序播放出来的
- 没有使用GPU,只使用了CPU,会造成CPU占用率极高(实际测试中,总能占满CPU)
- 代码编写麻烦
Stage3:使用Qt-vlc方式
优点:
- 支持的格式众多
- 可以打开多种直播流链接
缺点:
- 编译时比较麻烦
Stage4:使用FQFlib方式
在VLC没配置成后,就搜索"qt rtmp",找到了这个项目。这是一个正在成长中的项目,发布日期为2018年4月3日,距离现在仅有11天。主要是为了实现基于FFmpeg的rtsp/rtmp网络流媒体播放库。
作者仅给出了相应的库文件,以及一个基于QT的可运行在Visual Studio中的例子。
在经过尝试使用VS运行失败后,还是决定使用最熟悉的QT Creator运行,然后仿照在VS平台的例子,自己修改出来了一个例子,见GITHUB仓库
但是这个例子可以解析HTTP的直播链接,如CCTV1的:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
对于RTMP的链接,虽然可以加载,但是总是无法解析,遂放弃FQFlib的方式,继续寻找新方式。于是找到了QT-AV。
Stage5: Qt-AV开源项目
- GITHUB地址:https://github.com/wang-bin/QtAV
- 官方主页:http://www.qtav.org/
官方介绍:
QtAV is a multimedia playback library based on Qt and FFmpeg. It can help you to write a player with less effort than ever before.
QtAV has been added to FFmpeg projects page http://ffmpeg.org/projects.html
这个项目是2012年开始的,已经被ffmpeg官方收录了,的确是非常的方便。
下面简单写一下在Windows系统下的Qt-AV安装方式和使用方法,官方的文档在这里:https://github.com/wang-bin/QtAV/wiki/Build-QtAV,详见Qt视频框架QtAV构建编译使用 https://blog.csdn.net/dong_zhihong/article/details/102631049
5. 站在Qt-AV的角度看FQFlib
Qt-AV其实已经完成了FQFlib所要开发的对RTMP和RSTP格式直播流播放的支持,而且根据目前的实际测试其并不能播放RTMP(也可能是我自己没写好)
但是在已经有轮子的情况下,不太建议FQFlib的作者继续重新造轮子
RTMP测试源:rtmp://live.hkstv.hk.lxdns.com/live/hks
RTSP测试源:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
多说一点:
HTTP和RTMP是直播流链接的格式,而直播流本身也有编码格式和封装格式。编码格式如h.264格式(也叫MPEG-4)等;封装格式则为MP4、WMV、FLV等。具体可以在推流时使用不同的ffmpeg参数进行设置。
H.264的维基百科介绍:
H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Video Coding,缩写为MPEG-4 AVC)是一种面向块,基于运动补偿的视频编码标准(英语:Video_coding_format) 。
MP4和MPEG4并不同:参考自:Difference between MPEG4 and MP4
Key difference: MPEG-4 is a method of defining compression of audio and visual digital data. MPEG-4 can be used for compression of AV data for web, as used for streaming media, for CD distribution, as well as for voice broadcast television applications. The MP4 is a container format. This means that it can be used to store audio and/or video data.
总结
综合来说,Qt-AV给我留下的印象最好,其经过了6个年头的发展,也有了多次的版本迭代,已经较为完善。
如果您想要使用QT开发功能强大,支持播放“格式”众多且代码简单的播放器,非常推荐使用Qt-AV