【Qt】之音视频编程1:QtAV的背景和安装篇
QtAV 背景与核心概念
1. 什么是 QtAV?
QtAV 是一个基于 Qt 框架 和 FFmpeg 的多媒体播放库,旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力,并通过 Qt 的图形系统(如 QML、OpenGL)实现高效的视频渲染。
2. 开发背景
- 起源:
QtAV 由开发者 Wang Bin 于2013年发起,初衷是解决 Qt 原生多媒体模块(如Phonon
或Qt 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:
负责音视频解码(核心依赖libavcodec
、libavformat
等)。 - 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 编译(需权衡维护成本)。
- 简单播放:优先尝试 Qt 6 的
- 若可接受原生开发:
- Android:
ExoPlayer
(Google 推荐,支持 DASH/HLS/DRM)。 - iOS:
AVPlayer
+AVAssetReader
(精准帧控制)。
- Android:
- 跨平台框架:
- Flutter:
video_player
+ffmpeg_kit_flutter
插件。 - React Native:
react-native-video
。
- Flutter:
总结
- 能用但慎用:QtAV 适合已有 Qt 基础且需要复杂音视频功能的手机应用,但需面对性能和维护挑战。
- 推荐原生方案:大多数情况下,手机端音视频开发应优先选择平台专属库(Android/iOS),它们在性能、功耗和生态支持上更具优势。
QtAV 编译与安装指南
QtAV 是一个基于 Qt 和 FFmpeg 的多媒体播放库,支持跨平台(Windows、Linux、macOS、Android、iOS)。以下是详细的编译安装步骤:
1. 环境准备
1.1 依赖安装
(1) 安装 Qt
- 下载 Qt:从 Qt 官网 安装 Qt 5.15+ 或 Qt 6.x(建议使用 Qt 5.15 LTS)。
- 确保包含以下模块:
QtCore
、QtGui
、QtWidgets
(C++ 开发)QtQuick
、QtQml
(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 shared 或 static 版本(如 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软件新建项目
相关文章:

【Qt】之音视频编程1:QtAV的背景和安装篇
QtAV 背景与核心概念 1. 什么是 QtAV? QtAV 是一个基于 Qt 框架 和 FFmpeg 的多媒体播放库,旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力,并通过 Qt 的图形系统(如 QM…...

算法与数据结构 - 二叉树结构入门
目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…...

如何使用远程桌面控制电脑
目的: 通过路由器使用pc控制台式机,实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条:get ip地址与被控制机器的账户与密码。 现象挺神奇:被控制电脑的电脑桌面处于休眠模式,此时强行唤醒被控电脑会导致中断…...

SpringMVC-执行流程
目录 前言 一、SpringMVC执行流程 SpringMVC 主要组件 SpringMVC 的执行流程 简要分析执行流程 总结 前言 理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。 项目内容参考:SpringMVC-简介及入门-CSDN博客 一、SpringMVC执行流程 SpringMVC 主要组…...

计算机网络网络层(下)
一、互联的路由选择协议(网络层控制层面内容) (一)有关路由选择协议的几个概念 1.理想的路由算法 (1)理想路由算法应具备的特点:算法必须正确和完整的,算法在计算上应简单&#x…...

深入学习Zookeeper的知识体系
目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...
主从架构:技术原理与实现
一.简单介绍分布式锁的复习 今天在一个分布式锁的视频讲解中,提到了主从架构,所以有了这篇文章。 当然我们可以先说说分布式锁,可以使用redis的setnxlua脚本实现,或者也可以用redission实现,或者看门狗机制。 由看门…...
大模型核心运行机制
大模型核心运行机制目录 一、核心架构:Transformer的演进与改进1.1 核心组件包括:1.1.1 自注意力机制(Self-Attention)1.1.2 多头注意力(Multi-Head Attention)1.1.3 位置编码(Positional Encod…...

uniapp跨平台开发HarmonyOS NEXT应用初体验
之前写过使用uniapp开发鸿蒙应用的教程,简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本,小一年过去了HbuilderX的正式版本已经来到4.64,历经了多个版本的更新后,跨平台开发鸿蒙应用的体验大幅提升。今天再…...

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)
距离2025上半年“系统架构设计师”考试已经只剩最后两周了,还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习,特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分,可以参考此指南进行最后的复习要领&a…...
C语言主要标准版本的演进与核心区别的对比分析
以下是C语言主要标准版本的演进与核心区别的对比分析 K&R C(1978年) 定位:非标准化的原始版本,由Brian Kernighan和Dennis Ritchie定义 特性: 基础语法:函数声明无参数列表(如int func…...

使用 goaccess 分析 nginx 访问日志
介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…...

vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
vue3实现与springboot交互【完成登陆及页面跳转】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:…...

【Hot 100】208. 实现 Trie (前缀树)
目录 引言实现 Trie (前缀树)我的解题代码解析代码思路分析优化建议1. 内存泄漏问题2. 使用智能指针优化内存管理3. 输入合法性校验(可选)4. 其他优化 总结 🙋♂️ 作者:海码007📜 专栏:算法专栏…...

【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载
Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统,面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布,Ubuntu 强调易用性、安全性和稳定性,适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …...
思路解析:第一性原理解 SQL
目录 题目描述 🎯 应用第一性原理来思考这个 SQL 题目 ✅ 第一步:还原每个事件的本质单位 ✅ 第二步:如果一个表只有事件,如何构造事件对? ✅ 第三步:加过滤条件,只保留“同一机器、同一进…...
相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…...

Vue2 elementUI 二次封装命令式表单弹框组件
需求:封装一个表单弹框组件,弹框和表单是两个组件,表单组件以插槽的形式动态传入弹框组件中。 外部组件使用的方式如下: 直接上代码: MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.syn…...
Docker入门教程:常用命令与基础概念
目录 简介常用命令Docker 常用命令汇总docker run 命令格式与参数解析 简介 Docker 是一个客户端-服务器(client-server)架构的应用程序,其中包含两个主要组件:Docker 客户端和 Docker 守护进程(也称为 Docker Daemon…...

Antd中Form详解:
1.获取Form表单值的方式: ① 使用Form.useForm()钩子(推荐方式) const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...
探索C语言中的二叉树:原理、实现与应用
一、引言 二叉树作为一种重要的数据结构,在计算机科学领域有着广泛的应用,无论是在操作系统的文件系统管理,还是在数据库的索引构建中,都能看到它的身影。在C语言中,我们可以利用指针灵活地构建和操作二叉树。接下来&…...

docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)
Docker Desktop 报错信息 Docker Desktop - Windows Hypervisor is not present Docker Desktop is unable to detect a Hypervisor. Hardware assisted virtualization and data execution protection must be enabled in the BIOS.这是因为 Docker Desktop 需要启用 虚拟化技…...
03.Python 字符串中的空白字符处理
Python 字符串中的空白字符处理 什么是空白字符? 在处理字符串时,常常需要去除多余的空白字符。空白字符包括: 空格( )制表符(\t)换行符(\n)回车符(\r&#x…...

《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
手把手教你用 Kubernetes 部署高可用 WordPress 博客 本实验通过 Kubernetes 容器编排平台,完整部署了一个高可用的 WordPress 网站架构,包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的…...

Ubuntu源码版comfyui的安装
Comfyui也出桌面版了,但是想让大家多个人都使用怎么办呢?也有方法,安装Linux版,启动后会生成个网页地址,打开就能用了。 1、先来看下本地安装环境配置: 系统:Ubuntu 22.04 内存:2…...
多模态RAG与LlamaIndex——1.deepresearch调研
摘要 关键点: 多模态RAG技术通过结合文本、图像、表格和视频等多种数据类型,扩展了传统RAG(检索增强生成)的功能。LlamaIndex是一个开源框架,支持多模态RAG,提供处理文本和图像的模型、嵌入和索引功能。研…...
C++ 命令模式详解
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以参数化客户端使用不同的请求、队列或日志请求,以及支持可撤销的操作。 核心概念 设计原则 命令模式遵循以下设计原则: 单…...

制作一款打飞机游戏47:跳转
编辑器的问题 我们开始为不同的敌人编写一些行为,到目前为止进展顺利,一切都很棒。但上次我们遇到了一些问题,我们发现在这个编辑器中编写代码有时有点困难,因为当你想要在某行之间插入内容时,你不得不删除一切然后重…...

本地部署ollama及deepseek(linux版)
一、安装ollama export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download"curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/download|$OLLAMA_MIRROR|g" | shexport OLLAMA_MIRROR&q…...
Java Spring Boot项目目录规范示例
以下是一个典型的 Java Spring Boot 项目目录结构规范示例,结合了分层架构和模块化设计的最佳实践: text 复制 下载 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…...