QTAV编译和使用

文章目录

      • 1,简介
      • 2,QTAV源码编译
          • 2.1 下载 QtAV的源代码 和 ffmpeg库
          • 2.2 添加ffmpeg依赖
          • 2.3 QTAV编译、安装
      • 3,QTAV简单使用

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打开后如下图:

QTAV编译和使用_第1张图片
这个时候是无法编译的,因为依赖的ffmpeg的静态库和头文件都还没有添加。

2.2 添加ffmpeg依赖

将下面图1 ffmpeg的子文件夹里面的头文件和lib静态库copy到QT的环境下对应目录里(我的安装目录是:D:\Program_Files\QT\5.14.2\msvc2017)
QTAV编译和使用_第2张图片
copy到下图的include文件夹和lib文件夹里(然后就可以编译了):

QTAV编译和使用_第3张图片

2.3 QTAV编译、安装

可以通过QT Creator左下角按钮选择Release或Debug版本(我这里选择的是Release)
如果编译出现类似下面的错误,表示依赖的ffmpeg头文件或库缺失,将缺失的添加进入上面的文件夹里
QTAV编译和使用_第4张图片
编译输出显示类似如下表示编译成功
在这里插入图片描述
在编译输出文件夹D:\Git\Qt-AV\build-QtAV-Desktop_Qt_5_14_2_MSVC2017_32bit-Release里点击安装脚本sdk_install.bat

QTAV编译和使用_第5张图片
点击安装后,在Qt的开发目录下(我的是:D:\Program_Files\QT\5.14.2\msvc2017),可以看到QtAV的头文件和开发库已经安装,如下图:

头文件,
QTAV编译和使用_第6张图片

静态库文件,
QTAV编译和使用_第7张图片
至此,QTAV的头文件和静态库文件都有了,再加上QTAV编译输出文件夹里的动态库(如下图),
QTAV编译和使用_第8张图片
接下来可以在自己的项目中使用了。

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到对应的编译输出文件夹下后可以正常运行。

你可能感兴趣的:(PC)