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

标签: Qt开发技能  ffmpeg  windows

背景

简介

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%2Bx64.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;
}

效果如下
在这里插入图片描述

版权声明:本文为lxw88586390原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lxw88586390/article/details/107058013

智能推荐

Git基本原理(二)——Git分支、合并、变基

文章目录 Git基本原理(二)——Git分支、合并、变基 Git分支 创建分支 当前分支 切换分支 分支合并 变基 合并和变基的选择 Git基本原理(二)——Git分支、合并、变基 Git 的分支模型堪称它的“必杀技特性“,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 在很多版本控制系统中,创建分支是一个低效...

Elasticsearch 基本语法使用

上一篇我们已经安装好了es+kibana 这里我们将简单的说一下增删查的使用 solr和elasticsearch区别: 1、solr创建索引库慢、查询快 ||||||||||| elasticsearch创建索引快、查询慢 2、elasticsearch支持分布式,solr可以使用zookeeper做分布式 elasticsearch概念: node:节点,部署服务的服务器 cluster:集群...

<Halcon>自定义函数封装方法

文章目录 1、名词解释 2、例子介绍 1、处理原图与任务: 2、代码与解析: 3、Halcon函数封装方式 ①明确需求 ②选取函数部分进行函数创建,更改函数接口 ③运行验证与函数更改操作 有网友说不太清楚这个halcon函数的封装方法。今天写个教程帖子,大家一起进步分享。 1、名词解释 算子: 指Halcon中最基础、最底层的函数(即你看不到它的代码实现),一个算子只有一句话,例如threshol...

PSENet-pytorch源码精读(一)

PSENet-pytorch源码精读 PSENet的网络结构 PSENet的网络结构 PSENet是基于FPN的基础上实现的,使用ResNet作为backbone网络。 首先,从backbone中获取四个256通道的特征图(P2P_2P2​、P3P_3P3​、P4P_4P4​、P5P_5P5​)。为了进一步组合从低到高的语义特征,通过函数C来融合四个特征图,以获取具有1024个通道的特征图F,如下...

USG6300防火墙配置stelnet服务

为了方便远程管理,需要配置stelnet服务 安全起见,建议设置访问控制列表acl,限制登陆范围。 也可通过web管理设置  ...

猜你喜欢

(四)java+testng+poi之接口鉴权

1、HTTP是无状态协议 什么是无状态?就是说这一次的请求和上一次的请求是没有任何关系的,无法共享信息。好处就是速度快。 2、cookie、session的加入 HTTP请求是无状态的,所以解决共享信息的问题必须采用其他的手段,于是就有了sessionid,sessionid是基于cookie实现的。服务器为每一个用户生成一个不一样的随机字符串,每次向服务器发起HTTP请求时,都会把这个字符串传给...

Spring-IoC容器初始化

Spring Ioc容器 IoC容器最主要是对Bean对象的创建和依赖管里注入,是整个Spring IoC功能的核心 基本结构 Spring IoC结构很复杂,多个类继承实现关系混乱,但最基础的有三个 - BeanFactory,对IoC容器的基本行为做出了定义 - BeanDefinition,在IOC中可识别Bean资源文件的描述 - BeanDefinitionReader,加载Bean资源...

分布式电商项目四十二:发布商品功能-获取分类关联的品牌

发布商品功能-获取分类关联的品牌 在发布商品时,还需要获取当前选择分类的所有品牌,对应前端请求: 对应API文档: 由于返回的数据不是整个品牌表对应的数据,所有新建一个VO来保存返回的信息: 来到对应的控制层:/product/categorybrandrelation/brands/list: 之后创建方法实现方法getBrandsByCatId(catId): 之后重启服务,来到前端测试,可以...

Spring Batch Example

转自 https://www.mkyong.com/spring-batch/spring-batch-hello-world-example/ Spring Batch is a framework for batch processing – execution of a series of jobs. In Spring Batch, A job consists of many...

VirtualBox安装增强工具

打开虚拟机,启动centos 工具栏 点击「设备」-「安装增强功能」 接着手动执行命令,安装VBoxGuestAdditions 等待结束   【总结】 最后,简单总结一下Guest Additions和Extension Pack之前的区别:   Guest Additions Extension Pack 中文翻译 客户端增强包(也常被叫做 功能扩展包,扩展功能包等) 扩展...