Qt Multimedia

"image of multimedia icons, courtesy of misirlou from the Noun Project"

Qt Multimedi 是提供了一组丰富 QML 类型和 C++ 类,以处理多媒体内容的附件模块。它包含易于使用的 API,用于回放音频和视频文件并在屏幕上渲染这些,及用于从系统摄像头和麦克风录制音频和视频的综合 API。

该模块功能分为下列子模块:

Qt Multimedia 提供用于特定多媒体用例的 API。
Qt Multimedia Widgets 提供基于 Widget 的多媒体 API。
Qt Spatial Audio 提供用于在 3D 空间实现声场的 API。

快速入门

若要从 Qt 5 移植到 Qt 6,见 Qt Multimedia 的变化 .

若是 Qt Multimedia 新手,QML 类型可以 imported 进应用程序使用以下语句在 .qml 文件。

import QtMultimedia
					

要链接到 C++ 库,添加以下到工程 CMakeLists.txt 文件。代入 my_project 采用工程名称。

find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(my_project PRIVATE Qt6::Multimedia)
					

概述和重要话题

QML 类型

下表提纲了一些重要 QML 类型。

类型 描述
MediaPlayer 将音频/视频回放功能添加到场景。
CaptureSession 创建用于捕获音频/视频的会话。
Camera 访问连接到系统的摄像头。
AudioInput 访问连接到系统的音频输入 (麦克风)。
AudioOutput 访问连接到系统的音频输出 (扬声器、耳机)。
VideoOutput 显示视频内容。
MediaRecorder 录制音频/视频从 CaptureSession .
ImageCapture 从摄像头捕获静止图像。
视频 将视频回放功能添加到场景。使用 MediaPlayer and VideoOutput 类型以提供视频回放功能。

C++ 类

下表提纲了一些重要 C++ 类

描述
QMediaPlayer 从源回放媒体。
QVideoWidget 显示来自媒体播放器 (或捕获会话) 的视频。
QMediaCaptureSession 捕获音频/视频。
QCamera 访问连接到系统的摄像头
QAudioInput 访问连接到系统的音频输入 (麦克风)。
QAudioOutput 访问连接到系统的音频输出 (扬声器、耳机)。
QImageCapture 以摄像头捕获静止图像。
QMediaRecorder 从捕获会话录制媒体内容。
QVideoSink 访问和渲染单个视频帧。
QAudioSink 将原生音频数据发送给音频输出设备。

对于回放 QMediaPlayer , QAudioOutput 和 QVideoOutput 包含所有要求功能。其它类用于捕获音频和视频内容,其中 QMediaCaptureSession 是管理整个捕获/录制过程的中心类。

许可和归属

Qt Multimedia 模块在商业许可下是可用的来自 Qt 公司 。此外,它在自由软件许可下也是可用的。从 Qt 5.6 起,这些自由软件许可是 GNU LGPL (次一般公共许可) 第 3 版 ,或 GNU GPL (一般公共许可) 第 2 版 。见 Qt 许可 进一步了解细节。

FFmpeg 后端使用 FFmpeg 框架 。FFmpeg 是在 LGPLv2.1、GPLv2 或更高版本许可下,许可的。FFmpeg 的一些可选组件仅在 GPL 下可用。Qt 二进制包随附的 FFmpeg 后端,被配置成不包含仅在 GPLv2 下可用的任何组件。见 FFmpeg 许可页面 进一步了解细节。

目标平台和后端注意事项

在大多数平台,有 2 种不同后端可以用于 Qt Multimedia。

Qt 6.5 设置 FFmpeg 框架 作为 Windows、macOS、Android 和 Linux (除 Yocto 分发外) 的默认后端。本机后端,也就是 Linux 中的 gstreamer,macOS 中的 AVFoundation, Windows 中的 WMF,及 Android 中的 MediaCodec 框架,在 6.4 是默认的。这些仍然可用,但支持有限。这意味着我们将努力修复采用本机后端的关键问题,但不保证修复次要问题,且也不会采用本机后端实现新特征。此外,甚至采用 gstreamer 后端 (在 Linux) 的一些主要问题也不会被修复,由于 gstreamer 最难调试且从属 Linux 分发问题。

我们旨在使所有平台行为,尤其是与 FFmpeg 后端保持一致。尽管如此,事实上,格式、编解码器、高级摄像头特征和屏幕捕获仍存在从属平台问题。这的发生是由于我们无论如何都要使用一些平台 API,即使采用 FFmpeg,且采用 FFmpeg 硬件加速还存在特定问题,主要是在 ARM 体系结构上运行 Linux。已知从属后端的局限性,将文档化在各个类和方法中。

若默认 FFmpeg 后端出现问题,建议采用本机后端进行测试。可以切换到本机后端通过设置 QT_MEDIA_BACKEND 环境变量到 windows , gstreamer (在 Linux), darwin (在 macOS),或 android :

export QT_MEDIA_BACKEND=darwin
					

为强制将 FFmpeg 赋值作为使用后端,将变量设为 ffmpeg:

export QT_MEDIA_BACKEND=ffmpeg
					

在 Qt Multimedia 编译阶段,可以配置默认媒体后端凭借 cmake 变量 QT_DEFAULT_MEDIA_BACKEND .

参考和范例