QtAV是基于Qt和FFmpeg的音视频播放库。开发者能够很容易基于QtAV编写播放器。支持常见的功能如播放、截图、暂停、快进快退、音量控制、播放网络流媒体等。支持的渲染方式有QPainter、Direct2D、gdi+等。
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的静态库和头文件都还没有添加。
将下面图1 ffmpeg的子文件夹里面的头文件和lib静态库copy到QT的环境下对应目录里(我的安装目录是:D:\Program_Files\QT\5.14.2\msvc2017) copy到下图的include文件夹和lib文件夹里(然后就可以编译了):
可以通过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编译输出文件夹里的动态库(如下图), 接下来可以在自己的项目中使用了。
在自己的项目主目录下新建文件夹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到对应的编译输出文件夹下后可以正常运行。
