使用 QMediaPlayer 进行音频可视化
Posted
技术标签:
【中文标题】使用 QMediaPlayer 进行音频可视化【英文标题】:Audio visualization with QMediaPlayer 【发布时间】:2014-04-28 11:20:07 【问题描述】:我正在使用QMediaPlayer 播放音频,并且想要可视化音频电平(例如this video)。 我已经从 Qt 4 文档中找到了一个示例,但他们手动生成信号,我发现无法使用 QMediaPlayer 获取音频输出缓冲区。 我应该如何解决这个问题/是否有其他音频库(跨平台)可以做到这一点?
谢谢
【问题讨论】:
【参考方案1】:你应该看看QAudioProbe
。
QAudioProbe 类允许您监控正在播放或录制的音频。
由于QMediaPlayer
是QMediaObject
的子类,因此您将QAudioProbe
与bool 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 setPlaybackRate > 1 导致高音音频
如何在 QMediaPlayer 中获取媒体类型(视频或音频)?