为了使用Qt播放rtmp流媒体视频,本项目使用了QtAV库。QtAV支持硬件解码播放流媒体及本地视频。用于解码的AVPlayer继承于QObject,用于显示的WidgetRenderer继承于QWidget,使用中传入URL或文件地址即可播放媒体文件的音视频内容。
使用QtAV可以在官网下载编译好的库,也可以自行编译。下载库要注意下载合适的位数和编译器。
编译方法参考项目介绍,以及wiki页面Build QtAV。
总结如下:
下载源码
git clone https://github.com/wang-bin/QtAV.git
cd QtAV && git submodule update --init
编译方法
C:/Qt/5.15.2/msvc2019_64/
目录下的include/
,lib/
,bin/
文件夹。QtAV.pro
使用QtCreator编译。build-Release
文件夹下的sdk_install.bat
文件安装编译好的库。注意:将Qt运行库目录添加到环境变量,本例中为C:/Qt/5.15.2/msvc2019_64/bin
,如电脑中还安装了PyQt,要将改环境变量放在其他变量之前,否则编译出来的程序在QtCreator中可以运行,单独运行会找不到运行库。
#include <QApplication>
#include <QtAV>
#include <QtAVWidgets>
#include <qDebug>
int main(int argc, char *argv[])
{
QString url;
if (argc != 2){
url = "rtmp://58.200.131.2:1935/livetv/cctv9hd";
qDebug() << "default url:" << url;
}
else{
url = *(argv + 1);
qDebug() << "url:" << url;
}
QApplication a(argc, argv);
QStringList priorityList;
priorityList << "CUDA" << "FFmpeg";
QtAV::WidgetRenderer renderer;
renderer.show();
QtAV::AVPlayer player;
player.setRenderer(&renderer);
player.setVideoDecoderPriority(priorityList);
player.setBufferMode(QtAV::BufferBytes);
player.setBufferValue(1000);
player.play(url);
return a.exec();
}
网页播放器对rtmp的支持欠佳,大多调用flash播放,可使用5.x版本的video.js播放。随着flash退出历史舞台,多采用http-flv格式的网页直播方式。bilibili开源的flv.js支持http-flv格式的流媒体播放,也可配合FFmpeg播放rtmp流。