彩票走势图

Qt 6 中的Qt 多媒体:音频、视频、小部件更改概述|附下载

转帖|产品更新|编辑:鲍佳佳|2021-07-12 11:59:01.563|阅读 1351 次

概述:Qt 5 中的 Qt 多媒体有一个相当松散定义的范围。不同后端对 API 不同部分的支持并不一致,而且 API 本身的部分也不容易跨平台使用。对于 Qt 6,新版本尝试在一定程度上缩小范围,并致力于开发一组一致的功能,这些功能适用于所有支持的平台。但还没有达到这个目标,但希望通过 Qt 6.2.0 的发布填补大部分实施空白。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:


Qt开发便捷控件-让应用程序拥有与时俱进的功能区UI:

  • QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 :是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面操作系

Qt 6.2 的第一个测试版刚刚发布,并在多个其他新附加组件中加入了全新的 Qt 多媒体模块。(查看Qt6.2功能详情

Qt Multimedia 是一个模块,它在 Qt 6 中发生了一些相当大的变化。在很多方面,它是一个新的 API 和实现,即使重新使用了 Qt 5.15 中的一些代码。

虽然新版本试图为我们的大多数模块保持 Qt 5 和 Qt 6 之间尽可能多的源代码兼容性,但又不得不在进行大量更改以使 API 和实现适合未来,最终决定以最好的为目标API 而不是最大的兼容性。如果您一直在 Qt 5 中使用 Qt Multimedia,则需要对您的实现进行更改。

目标

Qt 5 中的 Qt 多媒体有一个相当松散定义的范围。不同后端对 API 不同部分的支持并不一致,而且 API 本身的部分也不容易跨平台使用。

对于 Qt 6,新版本尝试在一定程度上缩小范围,并致力于开发一组一致的功能,这些功能适用于所有支持的平台。但还没有达到这个目标,但希望通过 Qt 6.2.0 的发布填补大部分实施空白。

新版本希望在 Qt 6.2 中支持的主要用例是:

  • 音频和视频播放
  • 音频和视频录制(来自相机和麦克风)
  • 低级(基于 PCM)音频和音频解码
  • 与 Qt Quick 和小部件集成
  • 尽量使用硬件加速

据我们所知,这些功能涵盖了我们用户过去使用 Qt 多媒体的大部分用例。我们的目标是首先关注那些核心用例,并确保它们在我们的所有平台上一致工作,然后再使用新功能扩展模块。

内部架构变化

Qt 5 中的 Qt 多媒体具有复杂的基于插件的架构,使用多个插件来实现不同的前端功能。一个完整的多媒体后端实现将包含不少于 4 个插件。用于实现这些插件的后端 API 是公开的,很难调整和改进这些后端的功能。

构建的架构非常难以维护和开发模块。在 Qt6 中,我们选择显着简化这一过程并移除插件基础设施。现在在编译时选择后端并编译到 Qt Multimedia 的共享库中。现在只有一个后端 API 涵盖了所有多媒体,消除了我们在 Qt 5 中人为拆分成多个后端的问题。最后,我们选择将后端 API 设为私有,以便我们将来可以轻松调整和扩展它。

完成后,我们可以仔细查看平台相关后端代码所需的 API 和接口。我们设法将实现多媒体后端所需的类集从 40 个减少到 15 个,并减少了纯虚拟方法的数量,为许多非必要功能提供了后备实现。

新的后端 API 在某种程度上模仿了我们在 Qt Gui 中用于窗口系统集成的 QPA 架构,并且新的QPlatformMediaIntegration类现在确实作为一个通用的入口点和工厂类来实例化平台相关的后端对象。在大多数情况下,我们现在的目标是在公共 API 中的类和实现该功能的类之间建立一对一的关系。因此,公共QMediaPlayer API 有一个QPlatformMediaPlayer类实现平台相关功能。

通过这些更改,我们还可以删除大量在前端和后端之间重复的代码,并避免它们之间的大量呼叫转移。有了这个,我们还可以将许多跨平台功能和验证移到代码的共享、平台独立部分中。

总而言之,这极大地简化了我们的代码库,并在不丢失大量功能的情况下大大减少了代码大小。5.15 中的 Qt Multimedia 大约有 140.000 行代码,而我们目前在 Qt 6 中减少到大约 74.000 行代码。

支持的后端

在 Qt 6 中,我们还重新审视了支持的后端,并将其缩减为我们认为将来可以支持的一组。例如,在 Qt 5 中,我们在 Windows 上有三个完全不同的后端实现,使用 DirectShow、WMF 和一个单独的基于 WMF 的 WinRT 实现。

在 Qt 6 中,当前支持的集合是:

  • Linux,使用GStreamer
  • macOS和iOS,使用AVFoundation
  • Windows使用WMF
  • Android使用MediaPlayer和Camera Java APIs

Qt 6.3 计划支持 QNX。可能还会在 6.2 中及时在 WebAssembly 上使用低级音频。此外,我们仍有使用 PulseAudio 或 ALSA 在 Linux 上支持低级音频的代码,但目前尚未测试或支持这些代码。根据需求,我们可能会在以后的版本中将它们带回来。

公共 API

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 数据处理低电平音频,并直接从音频设备读取或写入该数据。

这个块在架构上仍然与我们在 Qt 5 中的非常相似,但很多细节都发生了变化。最值得注意的是,读取或写入音频设备的低级类已更改名称。它们现在称为QAudioSource 和QAudioSink。命名反映了它们的低级性质,并释放了我们在 Qt 5 中的旧名称(QAudioInput和QAudioOutput)以用于播放和捕获 API。

所述QAudioFormat  API已被清理和简化,现在支撑4最常用的PCM数据格式(8位无符号整型,16和32位有符号整数和浮点数据)。QAudioFormat还获得了新的 API 来处理音频通道的定位信息,但目前后端尚未完全支持。

我们还删除了已弃用的QSound类。QSoundEffect是它以低延迟播放短声音的替代品。QSoundEffect目前仍要求您使用 WAV 作为效果格式,但我们计划扩展此格式,并允许在 6.2 之后通过类播放压缩的音频数据。

回放

处理媒体文件播放的主要类是QMediaPlayer。QMediaPlayer的API已经比Qt 5简化了,我们现在已经从该模块中删除了所有的播放列表功能,这些功能是内置于Qt 5媒体播放器的,但使其API和实现变得复杂。我们计划在6.2之后将播放列表功能作为一个单独的独立类,如果需要,你可以将其连接到QMediaPlayer。目前,如果需要,你可以在 "播放器 "的例子中找到一些处理播放列表的代码。

另一方面,QMediaPlayer获得了渲染字幕的能力,你现在可以使用setActiveAudioTrack()、setActiveVideoTrack()和setActiveSubtitleTrack()方法来检查和选择想要的音频、视频或字幕轨道。

Qt 6中的QMediaPlayer要求你使用setAudioOutput()和setVideoOutput()方法主动连接到音频和视频输出。不设置音频输出将意味着该媒体播放器不播放音频。这是对Qt 5的改变,在Qt 5中,默认的音频输出总是被选中。这个改变是为了让音频和视频之间有一个对称的API,并简化与QML的整合。

一个用C++实现的最小的媒体播放器看起来像这样。

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();

 基于 C++/Widgets 的播放器示例具有更完整的实现,它还支持字幕和音频语言选择以及显示与媒体文件关联的元数据:

player_with_subtitles

或使用 QML:

Window { 
    MediaPlayer { 
        id: mediaPlayer 
        audioOutput: AudioOutput {} // 使用默认的音频路由
        videoOutput: videoOutput 
        source: “mymediafile.mp4” 
    } 

    VideoOutput { 
        id: videoOutput anchors.fill 
        : parent 
    } Component.onCompleted: mediaPlayer.play() }

    

 还有一个全新的基于 QML 的媒体播放器示例,使用 Qt Quick Controls 可用,您可以使用它:

媒体播放器


除了QMediaPlayer 之外,Qt 6 还具有跨平台支持,可以使用QAudioDecoder类将音频文件解码为原始 PCM 数据。该功能存在于 Qt 5 的某些平台上,但并未在所有平台上实现。

捕获和记录

捕获和记录功能在 Qt 6 中经历了最大的 API 更改。在 Qt 5 中,您必须神奇地将相机连接到记录器,而 Qt 6 现在带有更明确的 API 来设置捕获管道。

Qt 6 中的中心类是QMediaCaptureSession。录制音频/视频或捕获图像时始终需要此类。要设置录音会话,您可以使用setAudioInput()将音频输入连接到会话,如果您想从相机录制,请使用setCamera()将相机连接到它。

这里要注意的一件事是QAudioInput和QCamera充当两个输入通道。使用QAudioInput::setDevice()或QCamera::setCameraDevice()选择要使用的物理设备。选择设备后,QAudioInput和QCamera允许您更改该设备的属性,例如设置音量或相机的分辨率和帧速率。

QMediaCaptureSession允许将音频和视频输出连接到它以进行预览和监视。要拍摄静止图像,请使用setImageCapture()将QImageCapture对象连接到它

QMediaCaptureSession session;
QCamera camera;
session.addCamera(&camera);
QImageCapture imageCapture;
session.addImageCapture(&imageCapture);
camera.start();
imageCapture.captureToFile(“myimage.jpg”);

要录制音频和视频,请将QMediaRecorder连接到会话。QMediaRecorder允许通过指定一个请求记录特定的文件格式和编解码器QMediaFormat。在 Qt 6 中,我们没有在此处提供跨平台 API,使用不同格式和编解码器的枚举。由于编解码器支持取决于平台,您还可以查询QMediaFormat以获取支持的文件格式和编解码器集。后端还将始终尝试将请求的格式解析为支持的格式。因此,例如,如果您请求带有 H265 视频编解码器的 MPEG4 文件,但不支持 H265,则它可能会回退到 H264 或其他受支持的编解码器。

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();

除了设置格式之外,您还可以在编码器上设置其他属性,例如质量、分辨率和帧率。

有关 Qt 6 的更多信息

  1. Qt6.2版本发布:恢复Qt6.1版本中缺失的模块、并带来了对13个额外模块的支持
  2. C++跨平台框架Qt6第一个修复版本现已发布!
  3. c++开发框架Qt6:构建系统CMake详解
  4. Qt6.1教程:Qt Quick3D渲染实例
  5. 全面剖析Qt6新版构建系统CMake
  6. Qt里程碑事件——Qt6正式发布

 ====================================================

想要了解或购买Qt正版授权的朋友,欢迎,限时咨询送开发教程!

Qt技术交流群现已开通,QQ搜索群号“765444821或者扫描下方二维码即可加入


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP