使用 QMediaPlayer 进行音频可视化

Posted

技术标签:

【中文标题】使用 QMediaPlayer 进行音频可视化【英文标题】:Audio visualization with QMediaPlayer 【发布时间】:2014-04-28 11:20:07 【问题描述】:

我正在使用QMediaPlayer 播放音频,并且想要可视化音频电平(例如this video)。 我已经从 Qt 4 文档中找到了一个示例,但他们手动生成信号,我发现无法使用 QMediaPlayer 获取音频输出缓冲区。 我应该如何解决这个问题/是否有其他音频库(跨平台)可以做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

你应该看看QAudioProbe

QAudioProbe 类允许您监控正在播放或录制的音频。

由于QMediaPlayerQMediaObject 的子类,因此您将QAudioProbebool QAudioProbe::setSource(QMediaObject* source) 连接到QMediaPlayer,然后连接到void QAudioProbe::audioBufferProbed(const QAudioBuffer& buffer) 信号。该文档提供了一个示例。

audioBufferProbed 信号的槽中,您可以处理原始音频数据以计算音量,例如通过计算样本的RMS。看看这个article on calculating the RMS efficiently。

要显示音量,您可以使用QProgressBar,但使用Qt Widgets for Technical Applications 库可能会获得更好的性能,它也可以在音量显示所需的对数刻度上工作。

【讨论】:

谢谢,这正是我要搜索的内容。 我正在尝试做类似的事情并使用 audioBufferProbed 信号来捕获缓冲区,但问题是这个信号很快就会发出,即两次发射之间的差异接近 10 毫秒。有没有办法控制这个信号的发射?因此,在插槽中进行的 fft 处理被搞砸了。我这样做对吗? @astre 我认为没有任何方法可以控制信号速率。您可以创建一个代理类来执行此操作以将多个信号批处理在一起。或者,您可能希望在另一个线程中执行 FFT,例如使用 QtConcurrent::run 运行 FFT 并在 GUI 中使用 QFutureWatcher 以获取结果以显示它们。

以上是关于使用 QMediaPlayer 进行音频可视化的主要内容,如果未能解决你的问题,请参考以下文章

QMediaPlayer 不产生音频

QMediaPlayer setPlaybackRate > 1 导致高音音频

如何播放 amr 音频,QMediaPlayer 不支持?

如何在 QMediaPlayer 中获取媒体类型(视频或音频)?

PyQt5:QMediaPlayer 无法从 QBuffer 重放音频

8.2.2 QMediaPlayer类相关函数接口介绍