一、编译环境与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安装目录下的文件。
代码语言:javascript复制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的框架库:
代码语言:javascript复制#LIBS = -L$$quote(C:QtQt5.14.25.14.2mingw73_32lib) -lQtAV1 -lQtAVWidgets1
LIBS = -L$$quote(C:QtQt5.14.25.14.2msvc2017lib) -lQtAV1 -lQtAVWidgets1
LIBS = -lopengl32 -lglu32
三、使用QTAV开发播放器
3.1 mainwindow.cpp 源码
代码语言:javascript复制#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 源码
代码语言:javascript复制#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