Qt Multimedia
Qt Multimedia 是一个附加模块,提供丰富的 QML 类型和 C++ 类来处理多媒体内容。它包含一个易于使用的应用程序接口(API),用于播放音频和视频文件并在屏幕上渲染这些文件,还包含一个全面的应用程序接口(API),用于从各种来源录制音频和视频,包括系统摄像头和麦克风、屏幕或窗口捕获以及音频或视频内存缓冲区。
该模块的功能分为以下几个子模块:
Qt Multimedia | 为多媒体特定用例提供 API。 |
Qt Multimedia 小工具 | 提供基于 Widget 的多媒体 API。 |
Qt Spatial Audio | 提供用于在 3D 空间实现声场的 API。 |
开始使用
如果您要从 Qt 5 移植到 Qt 6,请参阅 Qt Multimedia 的更改。
如果您是Qt Multimedia 的新用户,可在.qml
文件中使用以下语句将 QML 类型导入应用程序。
import QtMultimedia
要与 C++ 库链接,请在项目的CMakeLists.txt
文件中添加以下语句。用项目名称代替my_project
。
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(my_project PRIVATE Qt6::Multimedia)
有关从源代码构建 Qt Multimedia 的指导,请参见从源代码构建 Qt Multimedia 。
概述和重要主题
QML 类型
下表概述了一些重要的 QML 类型。
类型 | 说明 |
---|---|
MediaPlayer | 为场景添加音频/视频播放功能。 |
CaptureSession | 创建捕获音频/视频的会话。 |
Camera | 访问连接到系统的摄像机。 |
AudioInput | 访问连接到系统的音频输入(麦克风)。 |
AudioOutput | 访问连接到系统的音频输出(扬声器、耳机)。 |
VideoOutput | 显示视频内容。 |
MediaRecorder | 从CaptureSession 录制音频/视频。 |
ImageCapture | 从摄像机捕捉静态图像。 |
Video | 为场景添加视频播放功能。使用MediaPlayer 和VideoOutput 类型提供视频播放功能。 |
ScreenCapture | 捕捉屏幕。 |
WindowCapture | 捕捉顶层窗口。 |
C++ 类
下表概述了一些重要的 C++ 类。
类 | 描述 |
---|---|
QMediaPlayer | 播放源媒体。 |
QVideoWidget | 显示媒体播放器或捕获会话中的视频。 |
QMediaCaptureSession | 捕获音频和视频 |
QCamera | 访问连接到系统的摄像头 |
QAudioInput | 访问连接到系统的音频输入(麦克风)。 |
QAudioOutput | 访问与系统连接的音频输出(扬声器、耳机)。 |
QImageCapture | 使用摄像头捕捉静态图像。 |
QMediaRecorder | 从捕获会话中录制媒体内容。 |
QVideoSink | 访问和渲染单个视频帧。 |
QAudioSink | 将原始音频数据发送到音频输出设备。 |
QScreenCapture | 捕捉屏幕 |
QWindowCapture | 捕捉顶层窗口 |
QVideoFrameInput | 用于显示或录制内存缓冲区中的视频帧。 |
QAudioBufferInput | 支持从内存缓冲区播放或录制音频。 |
播放音频和视频时,QMediaPlayer 、QAudioOutput 和QVideoWidget 包含所有必要的功能。其他类专门用于捕获音频和视频内容,其中QMediaCaptureSession 是管理整个捕获和录制过程的中心类。
许可和归属
Qt Multimedia 模块可通过Qt XML Company 的商业许可获得。此外,它还可根据自由软件许可证使用。自 Qt 5.6 起,这些自由软件许可证为GNU Lesser General Public License 第 3 版或GNU General Public License 第 2 版。更多详情,请参阅Qt 许可。
此外,Qt 6.9.1 中的Qt Multimedia 可能包含以下许可下的第三方模块:
GNU 宽通用公共许可证 v2.1 或更高版本和 BSD 3 条款 "新 "或 "修订 "许可证和 BSD 2 条款 "简化 "许可证和 BSD 源代码署名和 ISC 许可证和 MIT 许可证和 Mozilla 公共许可证 2.0 | |
MIT 许可 | |
Boost 软件许可证 1.0 | |
独立 JPEG 集团许可证 | |
zlib 许可证 |
请注意,视频压缩标准(如 H.264 媒体压缩标准)可能受专利保护,并可能产生专利使用费。这可能适用于任何实现,也适用于作为操作系统服务、通过第三方库或Qt Multimedia 的任何后端提供的实现。Qt 许可证不包含此类费用。
目标平台和后端说明
Qt Multimedia Qt Media Player 为媒体播放、录制和设备管理提供了用户友好的跨平台 API。核心 API 的实现,包括 , , , 和 ,都集成在 的主库中,无需额外的库。其他 API 使用称为媒体后端的插件库实现。主媒体后端基于QMediaDevices QAudioDevice QSoundEffect QAudioSink QAudioSource Qt Multimedia Qt Multimedia FFmpeg 构建,可确保无缝跨平台功能,在除 WebAssembly 和嵌入式 Linux/Boot2Qt 之外的所有平台上都是默认的。在 Boot2Qt 中,默认后端是基于GStreamer 构建的,但可以使用 环境变量启用 FFmpeg 媒体后端。QT_MEDIA_BACKEND
FFmpeg 后端
FFmpeg 媒体后端依赖于FFmpeg 7.1库,这些库包含在Qt Online Installer 中,并由维护者进行了测试。在线安装程序中的二进制包使用动态链接到 FFmpeg。因此,应用程序必须在其安装程序中捆绑 FFmpeg 二进制文件,或依赖于操作系统上已安装的 FFmpeg。除Linux/X11 外,FFmpeg 库会使用 Qt 的部署工具自动部署,如 "部署 Qt 应用程序"文档中所述。只要 FFmpeg 的主要版本与 Qt 使用的版本一致,应用程序也可以以共享或静态库的形式部署自己的 FFmpeg 构建。
虽然Qt Multimedia 可在大多数操作系统上利用 FFmpeg 媒体后端,但不同平台上的应用程序之间可能会出现特定平台的功能或视觉差异。FFmpeg 并不能在所有平台上提供完全相同的编解码器和格式支持,而且Qt Multimedia 功能的性能可能取决于仅在某些平台上才有的硬件支持。例如,FFmpeg 在采用 ARM 架构的 Linux 目标机上会遇到硬件加速方面的特定问题。因此,建议在所有目标平台上测试Qt Multimedia 应用程序。
注意: FFmpeg 项目根据各种许可证提供功能。通过在线安装程序提供的预构建 FFmpeg 库仅包含与许可证和属性中列出的许可协议一致的功能。
为便于开发和调试,某些 FFmpeg 功能可通过环境变量进行配置,这些环境变量是Qt Multimedia API 的一部分。
本地后端
为了与现有应用程序兼容,我们为每个操作系统维护了本地媒体后端:
- 嵌入式 Linux 上的GStreamer 后端
- MacOS 和 iOS 上的 AVFoundation
- Windows 上的 Windows Media Foundation
- 安卓系统上的 MediaCodec 框架
注: FFmpeg 媒体后端是默认后端,但仍可使用本地后端,但支持有限。GStreamer 后端仅在 Linux 上可用,建议仅用于嵌入式应用。
注意: Android 上的 MediaCodec 自 Qt 6.8 起已被弃用,并将在下一个主要版本中移除。
Qt 维护人员将努力修复本地后端的关键问题,但不保证修复次要问题,包括跨平台的不一致行为。新功能只会在 FFmpeg 媒体后端实现。
GStreamer 后端有一些私有 API,允许更精细的控制。不过,GStreamer 后端存在已知的错误。更多详情可参阅GStreamer 后端的平台说明。
后端限制将被记录在案,其状态将在相应的类中进行维护。
更改后端
如果默认 FFmpeg 后端出现问题,我们建议使用本地后端进行测试。您可以将QT_MEDIA_BACKEND
环境变量设置为windows
、gstreamer
(在嵌入式 Linux 上)、darwin
(在 macOS 和 iOS 上)或android
,从而切换到本地后端:
export QT_MEDIA_BACKEND=darwin
要强制指定 FFmpeg 为使用的后端,可将该变量设置为ffmpeg
:
export QT_MEDIA_BACKEND=ffmpeg
在Qt Multimedia 编译阶段,可通过 cmake 变量QT_DEFAULT_MEDIA_BACKEND
配置默认媒体后端。
目标平台注意事项
以下页面列出了特定目标平台的问题。
权限
从 Qt 6.6 开始,Qt Multimedia 模块使用新的QPermission API 来处理camera 和microphone 权限。这意味着 Qt 本身不再查询这些权限,因此需要直接从客户端应用程序进行查询。
有关如何将新的QPermission API 集成到应用程序中的示例,请参阅应用程序权限页面。
参考资料和示例
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.