QMediaPlayer setPlaybackRate > 1 导致高音音频

Posted

技术标签:

【中文标题】QMediaPlayer setPlaybackRate > 1 导致高音音频【英文标题】:QMediaPlayer setPlaybackRate > 1 causes high-pitched audio 【发布时间】:2021-02-11 12:43:28 【问题描述】:

我正在创建一个在 PyQt5 中播放播客的应用。它从 URL 中检索 MP3 并使用 QMediaPlayer 播放它。我遇到的问题是当我希望以更快的速度播放这些播客时。使用 setPlaybackRate(rate) 我在 1、1.25、1.5、1.75 和 2 之间更改速率。只要速率大于 1,声音就会变成高音花栗鼠的声音。

有没有办法解决这个问题?我正在使用 python-vlc,它在这方面工作得很好,但想切换到 QMediaPlayer 以删除 VLC 依赖项。非常感谢任何帮助。

【问题讨论】:

您的意思是音高绝对高于预期(例如,即使在 1.25 时也非常高)?否则,如果在 2 倍时播放高一个八度,这正是播放 rate 的变化。 不幸的是,我对八度音阶的了解不够准确,但即使在 1.25 时,人们说话的声音也有点像花栗鼠,而到了 1.5 时,它真的很糟糕。在 python-vlc 中,我可以将速度提高到 2 倍,而且声音听起来很正常,只是速度更快。如果playbackRate 不是这样,在QMediaPlayer 中还有其他方法吗? 见:***.com/q/33088043/984421。 @RickyKresslein 我并没有建议将其作为解决方案(如果是的话,我会将此作为一个骗局关闭)。关键是 Qt 目前不支持音高校正 - 所以你不能避免某种依赖。 @RickyKresslein 的重点是声音是基于频率的:如果你加倍速度,你就加倍频率,所以你会得到更高音调(高一个八度)的声音。您可以在 VLC(或 Youtube 等其他案例)上获得的是一种软件算法,该算法通过在速度较高时“剪切”样本或在速度较低时将样本加倍来对音频信号进行插值(实际上它有点复杂,但是这是基本概念)。你听过磁带或唱机以不同的速度播放吗? 【参考方案1】:

根据 Qt 文档

用于 Windows 的 Qt 多媒体功能在两个插件中实现;一 使用 Microsoft DirectShow API,另一个使用 WMF (Windows 媒体基金会)框架。在 Windows 中引入 DirectShow API 98,并从 Windows XP 开始逐渐弃用。媒体基金会 框架是在 Windows Vista 中引入的,以替代 DirectShow 和其他多媒体 API。因此,Qt 中的 WMF 插件 仅支持 Windows Vista 和更高版本的 操作系统。

默认情况下,Qt 更喜欢 DirectShow 而不是 windowsmediafoundation。 现在让我们来看看你的答案。

旧插件的 Directshow 插件在您更改播放速率时会更改音高

虽然新推出的 Windows Media Foundation (WMF) 不会影响宣传

所以我们要做的就是从directshow切换到windowsmediafoundaton

在导入其他内容之前,只需在代码顶部添加以下代码

import os
os.environ['QT_MULTIMEDIA_PREFERRED_PLUGINS'] = "windowsmediafoundation" 

这可能会起作用,如果在添加此代码后音频听不见,那么您所要做的就是从这里下载一些编解码器 https://codecguide.com/media_foundation_codecs.htm

【讨论】:

这对于 Windows 用户来说似乎是一个不错的选择,但是我希望该应用程序能够跨平台,因为我使用的是 Linux。

以上是关于QMediaPlayer setPlaybackRate > 1 导致高音音频的主要内容,如果未能解决你的问题,请参考以下文章

QMediaPlayer::position() 返回零

QMediaPlayer - 播放 youtube 音乐

QMediaPlayer - 如何从在线广播中获取元数据?

QT:将 QMediaPlayer 连接到 QProgressBar?

使用 QMediaPlayer 进行音频可视化

QMediaPlayer:发出 positionChanged() 时声音中断