1,简介
QtAV是基于Qt和FFmpeg的音视频播放库。开发者能够很容易基于QtAV编写播放器。支持常见的功能如播放、截图、暂停、快进快退、音量控制、播放网络流媒体等。支持的渲染方式有QPainter、Direct2D、gdi+等。
2,QTAV源码编译
2.1 下载 QtAV的源代码 和 ffmpeg库
QtAV的源代码:https://github.com/wang-bin/QtAV
FFmpeg的开发依赖库,ffmpeg-4.1-win64-dev.zip:https://ffmpeg.zeranoe.com/builds/
FFmpeg的运行依赖库,ffmpeg-4.1-win64-shared.zip:https://ffmpeg.zeranoe.com/builds/
下载完成后,
点击QtAV/QtAV.pro文件,用QT Creator打开后如下图:
这个时候是无法编译的,因为依赖的ffmpeg的静态库和头文件都还没有添加。
2.2 添加ffmpeg依赖
将下面图1 ffmpeg的子文件夹里面的头文件和lib静态库copy到QT的环境下对应目录里(我的安装目录是:D:\Program_Files\QT\5.14.2\msvc2017)
copy到下图的include文件夹和lib文件夹里(然后就可以编译了):
2.3 QTAV编译、安装
可以通过QT Creator左下角按钮选择Release或Debug版本(我这里选择的是Release)
如果编译出现类似下面的错误,表示依赖的ffmpeg头文件或库缺失,将缺失的添加进入上面的文件夹里
编译输出显示类似如下表示编译成功
在编译输出文件夹D:\Git\Qt-AV\build-QtAV-Desktop_Qt_5_14_2_MSVC2017_32bit-Release里点击安装脚本sdk_install.bat
点击安装后,在Qt的开发目录下(我的是:D:\Program_Files\QT\5.14.2\msvc2017),可以看到QtAV的头文件和开发库已经安装,如下图:
头文件,
静态库文件,
至此,QTAV的头文件和静态库文件都有了,再加上QTAV编译输出文件夹里的动态库(如下图),
接下来可以在自己的项目中使用了。
3,QTAV简单使用
在自己的项目主目录下新建文件夹avlib,将include文件夹和lib文件夹copy进去。
然后在项目的pro文件里添加如下:
INCLUDEPATH += \
$$PWD/avlib/include \
win32:CONFIG(debug, debug|release):\
LIBS += -L$$PWD/avlib/lib/ -lQtAVWidgetsd1 \
-L$$PWD/avlib/lib/ -lQtAVd1
else:win32:CONFIG(release, debug|release):\
LIBS += -L$$PWD/avlib/lib/ -lQt5AVWidgets \
-L$$PWD/avlib/lib/ -lQt5AV
下面是我的部分调用代码
//播放器初始化的部分代码
if(m_player_ == nullptr){
m_player_ = new QtAV::AVPlayer();
}
QVBoxLayout * vl = new QVBoxLayout(this);
QtAV::OpenGLWidgetRenderer * renderer = new QtAV::OpenGLWidgetRenderer(this);
vl->addWidget(renderer);
ui->widgetRender->setLayout(vl);
m_player_->setRenderer(renderer);
m_player_->setMediaEndAction(MediaEndAction_KeepDisplay);//播放结束保持最后一帧
vl->setContentsMargins(0, 0, 0, 0);
connect(ui->sliderTime, SIGNAL(sliderMoved(int)), SLOT(seekTimeBySlider(int)));
connect(ui->sliderTime, SIGNAL(sliderReleased()), SLOT(seekTimeBySlider()));
connect(ui->sliderTime, SIGNAL(clickToPosition(int)), SLOT(seekToPosition(int)));
connect(m_player_, SIGNAL(positionChanged(qint64)), this ,SLOT(onPositionChanged(qint64)));
connect(m_player_, SIGNAL(started()), this , SLOT(onStartPlay()));
connect(m_player_, SIGNAL(stopped()), this , SLOT(onStopPlay()));
//播放、暂停的部分代码:
if(m_player_->state() == QtAV::AVPlayer::StoppedState){
if(checked){
updatePlayPauseLargeBtn(false);
setVolume();
//avoid empty
if(urlList_.isEmpty()){
return;
}
if(curIndex_ < urlList_.size() && !urlList_.at(curIndex_).isEmpty()){
m_player_->play(urlList_.at(curIndex_++));
}else{
curIndex_ = 0;
m_player_->play(urlList_.at(curIndex_++));
}
}else{
updatePlayPauseLargeBtn(true);
}
}else{
// qDebug() << "on_pushButtonPlayPause_toggled lxs >>> "<<m_player_->isPaused();
m_player_->pause(!m_player_->isPaused());
updatePlayPauseLargeBtn(m_player_->isPaused());
}
这个时候运行会报错,因为还没有将动态库添加进来,将动态库copy到对应的编译输出文件夹下后可以正常运行。