一、编译环境与QTAV介绍
QTAV是开源的跨平台的播放器框架,框架是基于QT开发的,可以在Android、IOS、WINDOWS、Linux各个平台编译部署运行。
QTAV官网介绍: http://www.qtav.org/
QTAV源码下载地址GitHub: https://github.com/wang-bin/QtAV
直接在GitHub上下载最新的源码就行。
我当前使用的QT环境是QT5.14.2,编译器是minGW和VS2017 都采用的是32位的编译器。
QT的下载地址:https://download.qt.io/archive/qt/5.14/5.14.2/
当前编译时,我使用的ffmpeg的版本是4.2.2 ,也可以使用最新的版本,QTAV的说明里就介绍,最好使用最新的ffmpeg版本。
ffmpeg4.2.2的库地址:https://download.csdn.net/download/xiaolong1126626497/13328939
也可以直接去ffmpeg的官方下载:http://www.ffmpeg.org/download.html
二、编译QTAV源码
在GitHub上作者也介绍过,如何编译部署QTAV。
地址: https://github.com/wang-bin/QtAV/wiki/Build-QtAV
在windows下编译,作者推荐了2种方法:
第一种: 直接把ffmpeg的头文件和库文件拷贝到QT安装目录下的编译器目录里,这样做简单粗暴。
第二种: 打开QTAV源码工程,修改qmake.conf文件,指定ffmpeg的头文件和库文件路径
让QT编译器能找到ffmpeg库和头文件在哪里。
我这里就是采用的第二种方法,直接指定路径,不污染QT安装目录下的文件。
INCLUDEPATH += C:/FFMPEG/ffmpeg_x86_4.2.2/include
LIBS += -LC:/FFMPEG/ffmpeg_x86_4.2.2/lib
设置好路径之后,直接点击构建即可。
构建如果没有问题的话,在生成的目录下就会有一个自动安装脚本,双击运行即可自动拷贝文件到QT的安装目录下。
可以分别使用VS2017编译器、minGW编译器构建一遍QTAV源码,这样两个编译器都可以引用QTAV进行开发播放器。
编译完成之后,接下来就可以使用QTAV了。
在使用QTAV框架时,如果使用的是VS2017编译器,编译可能会报错,提示max函数不能识别。
解决办法如下:
在QT的pro工程文件里需要引用QTAV的框架库:
#LIBS += -L$$quote(C:\Qt\Qt5.14.2\5.14.2\mingw73_32\lib) -lQtAV1 -lQtAVWidgets1
LIBS += -L$$quote(C:\Qt\Qt5.14.2\5.14.2\msvc2017\lib) -lQtAV1 -lQtAVWidgets1
LIBS += -lopengl32 -lglu32
三、使用QTAV开发播放器
3.1 mainwindow.cpp 源码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Widgets::registerRenderers();
VideoOutput *m_vo;
AVPlayer *m_player;
m_player = new AVPlayer(this);
m_vo = new VideoOutput(this);
m_player->setRenderer(m_vo);
setCentralWidget(m_vo->widget());
m_player->play("D:/test1080.flv");
}
MainWindow::~MainWindow()
{
delete ui;
}
3.2 mainwindow.h 源码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtAV>
#include <QtAVWidgets>
using namespace QtAV;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H