从音频(或视频)文件生成波形?

Posted

技术标签:

【中文标题】从音频(或视频)文件生成波形?【英文标题】:Generating a waveform from an audio (or video) file? 【发布时间】:2015-12-04 19:49:15 【问题描述】:

我试图了解如何从音频(或视频)文件生成波形以显示给用户。

我已经在谷歌上搜索了很长一段时间,如果不使用 FFmpeg 之类的东西,我无法确定这在 Qt 中是否可行。我已经看过所有这些类:QMediaPlayer、QMediaContent、QMediaResource、QAudioProbe 并尝试了Qt Media Player Example,但我只是看不到我可以访问实际音频缓冲区的位置。

所以我有两个问题:

    如果没有 3rd 方库,我想做的事情是否可行? 如果可能的话,能否请某种灵魂概述我需要阅读和理解的内容才能访问音频数据

我已经尝试过这个问题 (Audio visualization with QMediaPlayer) 的建议,但 audioProbe->setSource(player) 的结果总是错误的,并且方法 processBuffer 永远不会被调用。

audioProbe = new QAudioProbe(this);
bool success = audioProbe->setSource(player);
qDebug() << success;

connect(audioProbe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(processBuffer(QAudioBuffer)));

更新:添加一些额外的细节,希望能澄清事情。

为了测试/学习,我使用的是 Qt 附带的 Media Player Example,因此它与 Q_OBJECT 等一起正确设置。

对于音频,我使用 .mp3 和 .wav 文件进行了测试。 FWIW,player 示例由于某种原因无法播放视频(.mp4、.avi 已测试)

代码中的player 是QMediaPlayer——它继承自QMediaObjectPlayer 类的示例代码是 here。我在播放器实例化后立即添加了我的代码(在上面的原始评论中)。我还尝试在加载媒体后添加它。

我尝试先将我的插槽声明为私有,然后再声明为公共 - 无论哪种方式,它都不会被调用。

这么简单的事情这么难,真让人沮丧。

【问题讨论】:

你在哪个平台上? 【参考方案1】:

走“无外部库”路线可能只会导致更多的头痛和不必要的工作。使用已建立的库的另一个优点是您不会被绑定到一种文件格式,因为并非所有格式都以相同的方式存储它们的数据。如果音频格式未压缩(wav 或其他),您可以读取标头,直到获得数据块。这个问题的答案here 在 C 中详细说明了这一点。您应该能够从中了解文件格式以将其应用于另一种语言。

在对数据进行任何有价值的操作之前,您需要了解 wav 文件中有多少个通道、位深度以及采样率。所有这些信息都可以从标题中获取。

【讨论】:

是的,原始音频比大多数人想象的要复杂得多。您想要一个由一直使用它的人提供的外部库。【参考方案2】:

事实证明,QAudioProbe 在 OSX 上不受支持——我正在使用的平台。花了相当长的时间(“Qt while.. .”)来找出这些信息,所以我在这里明确地发布它。

完整详情请参阅此文档:Qt 5.5.0 Multimedia Backends

【讨论】:

以上是关于从音频(或视频)文件生成波形?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HTML5 网络视频生成音频波形?

从音频文件生成波形图像

如何从HTML5网络视频生成音频波形?

从音频文件创建平面声波(波形)图像

找一个能即时显示音频波形软件

用Java获取音频文件的波形