QtAV视频播放器的介绍、编译以及简单使用

    技术2022-07-10  146

    背景

    简介

    QtAV是基于Qt和FFmpeg的多媒体播放库。它可以帮助您以前所未有的精力编写播放器。

    强大的功能

    QtAV可以满足您的最大需求

    硬件解码支持:DXVA2,VAAPI,VDA / VideoToolbox,CedarX,CUDA(第一个播放器在Linux上支持CUDA吗?)OpenGL和ES2支持几乎所有格式,包括Hi10P视频(第一个播放器/库在ES2中支持10bit?VLC,XBMC,mplayer现在不支持)实时预览RGB和YUV格式的视频捕获OSD和自定义过滤器libavfilter中的过滤器,例如stero3d,模糊字幕轨道选择。动态更改FFmpeg和libass引擎逐帧播放播放速度控制各种流:区域设置文件,http,rtsp等以及您的自定义流音频通道,轨道和外部音频轨道播放时动态更改渲染引擎。动态更改视频解码器1个播放器的多个视频输出视频均衡器(软件和OpenGL):亮度,对比度,饱和度,色相QML支持。大多数播放API与QtMultimedia模块兼容兼容性:QtAV可以同时使用Qt4和Qt5,FFmpeg(> = 1.0)和Libav(> = 9.0)来构建。建议使用最新的FFmpeg版本。

    QtAV的编译

    以下是我在windows平台使用的过程,其它平台的还没有验证过

    前期准备

    下载QtAV源码 git clone https://github.com/wang-bin/QtAV.git cd QtAV && git submodule update --init 下载FFmpeg 您可以下载最新的预构建FFmpeg,也可以自己构建。 对于Windows,请下载http://sourceforge.net/projects/qtav/files/depends/QtAV-depends-windows-x86+x64.7z/download,并且bin, include, lib在软件包中使用就可以构建。 目前我是windows下面构建的,所以直接选择的下载上面这个软件包。

    环境设置

    你必须让编译器知道FFmpeg的头文件和库所在的位置,否则待会儿编译QTAV的时候会因为找不到对应的库文件而报错。 软件包下载的文件解压后如下图所示 将对应的头和库文件放入到Qt目录 以Windows为例,Qt安装在中C:\workSpace\Qt\Qt5.10.0\5.10.0\mingw53_32。转到该目录,然后将ffmpeg标头放置到include\,将库放置到lib

    加载QTAV工程并且编译

    编译完成文件夹如下: 双击sdk_install.bat,会自动拷贝编译完成的文件到qt文件夹内 到目前为止已经完成qtav相关的所有工作了。

    QT工程中简单调用QTAV相关库

    pro文件中引入avwidgets 代码中引入相应的头文件 #include <QtAV> #include <QtAVWidgets>

    请确保在使用渲染器前调用QtAV::Widgets::registerRenderers()

    具体的示例工程如下,最简单的调用

    mainwindow.h

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtAV> #include <QtAVWidgets> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QtAV::VideoOutput *m_vo; QtAV::AVPlayer *m_player; }; #endif // MAINWINDOW_H

    mainwindow.cpp

    #include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QtAV::Widgets::registerRenderers(); m_player = new QtAV::AVPlayer(this); m_vo = new QtAV::VideoOutput(this); m_player->setRenderer(m_vo); setCentralWidget(m_vo->widget()); connect(ui->actionOpen_O, &QAction::triggered, [this]{ QString file = QFileDialog::getOpenFileName(0, tr("Open a video")); if (file.isEmpty()) return; m_player->play(file); }); } MainWindow::~MainWindow() { delete ui; }

    效果如下

    Processed: 0.014, SQL: 9