时间:2022-09-17 10:28:54 | 栏目:Python代码 | 点击:次
我们希望在 Qt 6.2 中支持的主要用例是:
在 Qt 6 中,当前支持的集合是:
Qt Multimedia的公共 API由 5 个大型功能块组成。其中三个块已经存在于 Qt 5 中,但是这些块中的 API 发生了重大变化。功能块是:
在做新的 API 的时候,我们也希望在 C++ 和 QML 之间有一个统一的 API。这使我们可以删除大量代码,这些代码只是简单地包装了 C++ API 并以稍微不同的方式将其暴露给 QML。对于大多数公共 C++ 类,现在有一个相应的同名 QML 项。所以QMediaPlayer并例如具有相应QML MediaPlayer的具有相同的API作为C ++类的项目。
让我们从设备发现开始。新的QMediaDevices 类旨在为您提供有关可用音频和视频设备的信息。它将允许您列出可用的音频输入(通常是麦克风)、音频输出(扬声器和耳机)和摄像头。您可以检索默认设备,类还会通知您有关配置的任何更改,例如,当用户连接外部耳机时。
QMediaDevices devices; connect(&devices, &QMediaDevices::audioInputsChanged, []() { qDebug() << “available audio inputs have changed”; }
此功能块有助于使用原始 PCM 数据处理低电平音频,并直接从音频设备读取或写入该数据。
处理媒体文件播放的主要类是QMediaPlayer。该QMediaPlayer API已经从我们在Qt5简化了我们必须从现在模块去掉了所有的播放列表功能,这在过去是内置了Qt 5媒体播放器,但其复杂的API和实现。我们计划在 6.2 之后将播放列表功能作为一个单独的独立类带回来,然后您可以在需要时连接到QMediaPlayer。现在,如果需要,您可以在“播放器”示例中找到一些处理播放列表的代码。
另一方面,QMediaPlayer获得了渲染字幕的能力,您现在可以使用setActiveAudioTrack()、setActiveVideoTrack()和setActiveSubtitleTrack()方法检查和选择所需的音频、视频或字幕轨道。
Qt 6 中的 QMediaPlayer 要求您使用setAudioOutput()和setVideoOutput()方法将其主动连接到音频和视频输出。不设置音频输出将意味着媒体播放器不播放音频。这是对 Qt 5 的更改,在 Qt 5 中始终选择默认音频输出。进行了更改以允许音频和视频之间的对称 API 并简化与 QML 的集成
除了QMediaPlayer 之外,Qt 6 还具有跨平台支持,可以使用QAudioDecoder类将音频文件解码为原始 PCM 数据。该功能存在于 Qt 5 的某些平台上,但并未在所有平台上实现。
用 C++ 实现的最小媒体播放器如下所示:
//widget示例 QMediaPlayer player; QAudioOutput audioOutput; // chooses the default audio routing player.setAudioOutput(&audioOutput); QVideoWidget *videoOutput = new QVideoWidget; player.setVideoOutput(videoOutput); player.setSource(“mymediafile.mp4”); player.play(); //qml示例 Window { MediaPlayer { id: mediaPlayer audioOutput: AudioOutput {} // use default audio routing videoOutput: videoOutput source: “mymediafile.mp4” } VideoOutput { id: videoOutput anchors.fill: parent } Component.onCompleted: mediaPlayer.play() }
捕获和记录功能在 Qt 6 中经历了最大的 API 更改。在 Qt 5 中,您必须神奇地将相机连接到记录器,而 Qt 6 现在带有更明确的 API 来设置捕获管道。
Qt 6 中的中心类是QMediaCaptureSession。录制音频/视频或捕获图像时始终需要此类。要设置录音会话,您可以使用setAudioInput()将音频输入连接到会话,如果您想从相机录制,请使用setCamera()将相机连接到它。
这里要注意的一件事是QAudioInput和QCamera充当两个输入通道。使用QAudioInput::setDevice()或QCamera::setCameraDevice()选择要使用的物理设备。选择设备后,QAudioInput和QCamera允许您更改该设备的属性,例如设置音量或相机的分辨率和帧速率。
QMediaCaptureSession允许将音频和视频输出连接到它以进行预览和监视。要拍摄静止图像,请使用setImageCapture()将QImageCapture对象连接到它。
要录制音频和视频,请将QMediaRecorder连接到会话。QMediaRecorder允许通过指定一个请求记录特定的文件格式和编解码器QMediaFormat。在 Qt 6 中,我们没有在此处提供跨平台 API,使用不同格式和编解码器的枚举。
由于编解码器支持取决于平台,您还可以查询QMediaFormat以获取支持的文件格式和编解码器集。后端也将始终尝试将请求的格式解析为支持的格式。
因此,例如,如果您请求带有 H265 视频编解码器的 MPEG4 文件,但不支持 H265,则它可能会回退到 H264 或其他受支持的编解码器。
除了设置格式之外,您还可以在编码器上设置其他属性,例如质量、分辨率和帧率。
QMediaCaptureSession session; QCamera camera; session.addCamera(&camera); QImageCapture imageCapture; session.addImageCapture(&imageCapture); camera.start(); imageCapture.captureToFile(“myimage.jpg”); QMediaRecorder recorder; session.setRecorder(&recorder); QMediaFormat format(QMediaFormat::MPEG4); format.setAudioCodec(QMediaFormat::AudioCodec::AAC); format.setVideoCodec(QMediaFormat::VideoCodec::H265); recorder.setMediaFormat(format); recorder.setOutputLocation(“mycapture.mp4”); recorder.record();
在 6.2 之后,我们将研究待办事项中的几个项目。这些想法的优先级尚未完成,关于您的需求的反馈将在这里帮助我们。我们的想法包括:
然而,目前,我们的大部分工作都集中在错误修复和为 Qt 6.2 做好一切准备上。由于较大的变化,在实现中仍然存在许多粗糙的边缘,并且某些功能可能存在错误或缺少功能。我们的目标是在 6.2.0 中修复这些问题,但需要您的反馈才能这样做。
最近发布的 Qt 6.2 测试版确实有 Qt 多媒体的二进制文件,您可以轻松地尝试和使用它们。我们非常感谢任何反馈,无论是在博客上还是在 bugreports.qt.io。