当前位置: 首页 > ai >正文

【Qt】之音视频编程1:QtAV的背景和安装篇

QtAV 背景与核心概念

1. 什么是 QtAV?

QtAV 是一个基于 Qt 框架FFmpeg 的多媒体播放库,旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力,并通过 Qt 的图形系统(如 QML、OpenGL)实现高效的视频渲染。


2. 开发背景
  • 起源
    QtAV 由开发者 Wang Bin 于2013年发起,初衷是解决 Qt 原生多媒体模块(如 PhononQt Multimedia)的局限性:
    • 功能不足:原生模块对现代视频格式(如 H.264/H.265)支持有限,且性能较低。
    • 依赖复杂:直接使用 FFmpeg 需要处理复杂的底层 API,而 QtAV 提供了更友好的 Qt 风格接口。
  • 目标用户
    需要嵌入音视频功能的 Qt 开发者(如视频编辑器、监控系统、流媒体播放器等)。

3. 核心特性
  • 跨平台支持
    支持 Windows、Linux、macOS、Android 和 iOS,依赖 Qt 的跨平台能力。
  • 高性能渲染
    利用硬件加速(如 DXVA2、VAAPI、VDPAU、OpenGL)提升解码和渲染效率。
  • 灵活的渲染方式
    支持多种后端:
    • OpenGL(默认,适合高性能场景)
    • QPainter(纯软件渲染,兼容性强)
    • Direct2D(Windows 专属)
    • GDI(传统方式,性能较低)
  • 功能丰富
    支持音视频同步、字幕加载、逐帧播放、滤镜(如旋转、裁剪)、网络流媒体(RTMP/HTTP)等。
  • 易用的 API
    提供 C++ 和 QML 两种接口,适合快速集成到 Qt 项目中。

4. 技术栈依赖
  • FFmpeg
    负责音视频解码(核心依赖 libavcodeclibavformat 等)。
  • Qt
    提供跨平台 GUI 支持和信号槽机制(需 Qt 5 或更高版本)。
  • 可选硬件加速库
    如 CUDA(NVIDIA)、MediaCodec(Android)等。

5. 与类似库的对比
库/模块优势局限性
QtAV功能全面,性能高,支持硬件加速需手动编译 FFmpeg 依赖
Qt Multimedia官方维护,简单易用功能较少,性能一般
VLC-Qt基于 VLC,格式支持广泛体积较大,License 限制(LGPL)
GStreamer管道化设计,灵活性强配置复杂,学习曲线高

6. 典型应用场景
  • 桌面播放器:如基于 Qt 的本地/网络视频播放器。
  • 视频监控:实时解码多路摄像头流。
  • 教育/会议系统:支持屏幕共享、字幕同步。
  • 嵌入式设备:如车载娱乐系统、工业控制界面。

7. 快速体验
// QML 示例:快速集成一个播放器
import QtAV 1.7
VideoOutput {source: "video.mp4"anchors.fill: parent
}
// C++ 示例:基本播放控制
QAVPlayer player;
player.setFile("video.mp4");
player.play();

8. 现状与未来
  • 维护状态
    目前 QtAV 更新较慢(最新版本为 1.13.0,2021年),但核心功能稳定。部分开发者转向基于 FFmpeg 的其他现代方案(如 QtMultimedia + FFmpeg 组合)。
  • 替代方案
    Qt 6 的 Qt Multimedia 模块已逐步增强,但对高级功能仍需第三方库补充。

实际应用

在实际手机应用开发中,QtAV 的使用场景有限,但并非完全不可行。是否选择它取决于具体需求和技术栈。以下是详细分析:


1. 手机端使用 QtAV 的可行性

适用场景
  • 跨平台 Qt 应用
    如果手机应用本身基于 Qt/QML 开发(如使用 Qt for Android/iOS),且需要高级音视频功能(如硬解码、自定义渲染),QtAV 是一个可选方案。
  • 功能需求复杂
    需要处理特殊视频格式(如 RTSP 监控流)、逐帧控制、滤镜等超出 Qt Multimedia 能力的场景。
不适用场景
  • 原生开发主导
    大多数手机应用采用原生开发(Android/Kotlin 或 iOS/Swift),直接使用平台专属库更高效(如 Android 的 MediaCodec/ExoPlayer 或 iOS 的 AVFoundation)。
  • 性能敏感场景
    QtAV 的跨平台抽象层可能带来额外性能开销,不如原生库优化彻底。

2. 手机端音视频的常见技术方案

平台/场景推荐方案优势
Android 原生MediaCodec + MediaPlayer/ExoPlayer官方支持,硬件加速完善,生态成熟
iOS 原生AVFoundation/AVPlayer低延迟,系统级优化
跨平台框架Flutter(video_player 插件)快速集成,适合简单播放需求
Qt 应用QtAV 或 Qt Multimedia + FFmpeg 定制适合已有 Qt 代码库的项目

3. QtAV 在手机端的局限性

  • 性能问题
    • 移动端硬件碎片化严重,QtAV 的硬件加速可能不如原生方案稳定。
    • 功耗优化较差,长时间解码可能增加电量消耗。
  • 依赖复杂度
    • 需要手动编译 FFmpeg 并链接到移动端项目(尤其是 iOS 需处理静态库和许可问题)。
    • 增加应用体积(FFmpeg 库通常较大)。
  • 维护风险
    QtAV 更新缓慢,对最新手机系统(如 Android 14/iOS 17)的适配可能滞后。

4. 实际案例参考

  • Qt 开发的工业/车载应用
    部分车载娱乐系统(基于 Qt)使用 QtAV 播放本地或网络视频。
  • 跨平台监控应用
    需要同时支持桌面和移动端的监控软件,可能选择 QtAV 保持代码统一。
  • 淘汰案例
    普通社交/短视频 App 通常转向原生方案(如 ExoPlayer)以获得更好的用户体验。

5. 替代建议

  • 若坚持 Qt 技术栈
    • 简单播放:优先尝试 Qt 6 的 Qt Multimedia(已支持更多格式)。
    • 高级功能:QtAV + 自定义 FFmpeg 编译(需权衡维护成本)。
  • 若可接受原生开发
    • Android:ExoPlayer(Google 推荐,支持 DASH/HLS/DRM)。
    • iOS:AVPlayer + AVAssetReader(精准帧控制)。
  • 跨平台框架
    • Flutter:video_player + ffmpeg_kit_flutter 插件。
    • React Native:react-native-video

总结

  • 能用但慎用:QtAV 适合已有 Qt 基础且需要复杂音视频功能的手机应用,但需面对性能和维护挑战。
  • 推荐原生方案:大多数情况下,手机端音视频开发应优先选择平台专属库(Android/iOS),它们在性能、功耗和生态支持上更具优势。

QtAV 编译与安装指南

QtAV 是一个基于 QtFFmpeg 的多媒体播放库,支持跨平台(Windows、Linux、macOS、Android、iOS)。以下是详细的编译安装步骤:


1. 环境准备

1.1 依赖安装

(1) 安装 Qt
  • 下载 Qt:从 Qt 官网 安装 Qt 5.15+Qt 6.x(建议使用 Qt 5.15 LTS)。
  • 确保包含以下模块
    • QtCoreQtGuiQtWidgets(C++ 开发)
    • QtQuickQtQml(QML 开发)
    • QtMultimedia(可选,用于对比测试)
(2) 安装 FFmpeg

QtAV 依赖 FFmpeg 进行音视频解码,需要手动编译或安装预编译版本:

  • Linux (Ubuntu/Debian):
    sudo apt install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
    
  • macOS (Homebrew):
    brew install ffmpeg
    
  • Windows
    • 下载 FFmpeg sharedstatic 版本(如 gyan.dev)。
    • 解压后添加 bin 目录到系统 PATH
(3) 可选依赖(硬件加速)
  • OpenGL(默认渲染方式)
  • CUDA(NVIDIA GPU 加速)
  • VAAPI/VDPAU(Linux 视频加速)

2. 获取 QtAV 源码

git clone https://github.com/wang-bin/QtAV.git
cd QtAV
git submodule update --init  # 更新子模块(如果有)

3. 编译 QtAV

3.1 使用 qmake 编译(推荐)

(1) 生成 Makefile
mkdir build
cd build
qmake ../QtAV.pro  # 默认使用系统 FFmpeg

自定义 FFmpeg 路径(如果 FFmpeg 不在系统路径):

qmake ../QtAV.pro "FFMPEG_HOME=/path/to/ffmpeg"
(2) 编译并安装
make -j4       # 多线程编译(根据 CPU 核心数调整)
sudo make install  # 安装到系统(Linux/macOS)
  • Windows 下直接运行 nmake(MSVC)或 mingw32-make(MinGW)。
(3) 验证安装
  • 头文件默认安装到 /usr/local/include/QtAV(Linux/macOS)或 C:\QtAV(Windows)。
  • 动态库(.so/.dll)安装到系统库目录。

3.2 使用 CMake 编译(可选)

mkdir build
cd build
cmake .. -DQt5_DIR=/path/to/Qt5 -DFFMPEG_HOME=/path/to/ffmpeg
cmake --build . --parallel
sudo cmake --install .

4. 运行测试

4.1 测试命令行播放器

QtAVPlayer  # 或直接运行编译生成的 player 示例

如果提示找不到库,设置环境变量:

  • Linux/macOS:
    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    
  • Windows:
    set PATH=C:\path\to\QtAV\bin;%PATH%
    

4.2 测试 QML 播放器

import QtQuick 2.0
import QtAV 1.7VideoOutput {source: "file:///path/to/video.mp4"anchors.fill: parent
}

5. 常见问题

5.1 FFmpeg 版本不兼容

  • 确保 FFmpeg 版本 ≥ 4.0(推荐 5.x)。
  • 如果报错 undefined symbol: avcodec_receive_frame,可能是 FFmpeg API 变更,需重新编译 QtAV。

5.2 找不到 QtAV 模块

  • QML 报错 module "QtAV" is not installed
    sudo cp -r /usr/local/qml/QtAV /path/to/Qt/qml/  # 手动复制 QML 插件
    

5.3 硬件加速失败

  • 检查 OpenGL 驱动是否正常:
    glxinfo | grep OpenGL  # Linux
    
  • 尝试切换渲染后端:
    VideoOutput {renderer: OpenGL  // 可选:QPainter、Direct2D(Windows)
    }
    

6. 卸载 QtAV

sudo make uninstall  # qmake 方式
# 或手动删除安装的文件:
sudo rm -rf /usr/local/include/QtAV /usr/local/lib/libQtAV* /usr/local/qml/QtAV

总结

步骤关键命令/操作
1. 安装依赖Qt + FFmpeg
2. 克隆源码git clone https://github.com/wang-bin/QtAV.git
3. 编译安装qmake + make + make install
4. 测试QtAVPlayer 或 QML 示例

windows的免编译安装(实测可用)

1. 环境准备

需要自己在windows环境安装QtCreator(Qt)
并按照下面的安装指导安装QtAV的库

2. 安装包下载

  • 下面这个网站可以下载自己想要的MinGW64/32 或 VS版本的成品库(或库安装包)
    https://sourceforge.net/projects/qtav/files/release/
    文章附了两个已经下载好的软件包
  • 下载注意:可能下载不到需要点击Problems Downloading? – 选择一个可用节点(需要自己试)
    在这里插入图片描述
  • 需要下载ffmpeg开发包:
    https://sourceforge.net/projects/avbuild/files/windows-desktop/

3. 头文件安装

  • 把QtAV包和ffmpeg包 中的头文件拷贝到 Qt的头文件路径中
    在这里插入图片描述

4.环境变量设置

  • 不管自己下载的是压缩包还是exe文件,把它解压到指定路径,比如D:\program\QtAV1.4.2MinGW64

目录形式

  • bin 目录 (可能带有ffmpeg库文件,也可能没带。没带是因为它把ffmpeg库和QtAV库集成在一起了所以它会很大)
    在这里插入图片描述
    在这里插入图片描述
  • 把bin路径添加到环境变量中
    在这里插入图片描述

测试例子

  • .pro文件添加:
    版本1:(bin目录中没带ffmpeg的库:avcodec.dll)
# 指定QtAV路径
LIBS += -L D:/program/QtAV1.4.2MinGW64/bin \-lQt5AV1 \-lQt5Widgets

版本2:(bin目录中带有ffmpeg的库:avcodec.dll)

# 指定QtAV路径
LIBS += -L D:/program/QtAV1.11.0MinGW32/bin \-lQtAV1 \-lQtAVWidgets1-lavcodec-57-lavformat-57-lavutil-55-lswscale-4
  • main.cpp:
#include <QtAV/QtAV>
#include <QtAVWidgets/QtAVWidgets>
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 1. 创建播放器和视频输出QtAV::AVPlayer player;QtAV::WidgetRenderer renderer;  // 替代旧的VideoOutput// 2. 设置窗口属性renderer.widget()->setWindowTitle("QtAV Player");renderer.widget()->resize(800, 600);renderer.widget()->show();// 3. 关联播放器和渲染器(新API)player.setRenderer(&renderer);// 4. 播放视频player.play("../player/test.mp4");return a.exec();
}

在这里插入图片描述

  • 效果
    注意:头文件及环境变量安装完成后 才能打开Qt软件新建项目
    在这里插入图片描述
http://www.xdnf.cn/news/5811.html

相关文章:

  • 蓝桥杯12届国B 纯质数
  • git Authentication failed for 的解决办法
  • 重构门店网络:从“打补丁“到“造地基“的跨越
  • IDEA查看类结构视图窗口,接口的所有的实现类图
  • Python爬虫常用项
  • Spring @Transactional事务传播机制与MySQL事务原理解析
  • 【日撸 Java 300行】Day 14(栈)
  • 关于IDE的相关知识之二【插件推荐】
  • 基于FPGA的视频接口之千兆网口(七GigE)
  • 多线程爬虫语言选择与实现
  • 青少年编程与数学 02-019 Rust 编程基础 09课题、流程控制
  • 手机相册的 “智能分类” 功能
  • point3d 视野朝向设置
  • 使用交互式半自动化标注工具制作语义分割数据集
  • AI智能分析网关V4助力工厂/工地/车间/能源矿山场景玩手机行为精准检测与安全生产智能化监管
  • 视频编辑软件无限音频、视频、图文轨
  • 电机控制储备知识学习(一) 电机驱动的本质分析以及与磁相关的使用场景
  • vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
  • VTK|类似CloudCompare的比例尺实现1-源码分析
  • 【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)
  • WebGIS 开发黑科技:解锁地理信息的新视界
  • 大模型常用位置编码方式
  • 信息论14:从互信息到信息瓶颈——解锁数据压缩与特征提取的秘密
  • 分析Docker容器Jvm 堆栈GC信息
  • 【简单易懂】SSE 和 WebSocket(Java版)
  • 删除购物车中一个商品
  • Unity
  • KMDA-6920成功助力印度智慧钢厂SCADA系统,打造高效可靠的生产监控平台
  • 菜狗的脚步学习
  • 【android bluetooth 框架分析 02】【Module详解 7】【VendorSpecificEventManager 模块介绍】