从音频(或视频)文件生成波形?
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——它继承自QMediaObject
。 Player
类的示例代码是 here。我在播放器实例化后立即添加了我的代码(在上面的原始评论中)。我还尝试在加载媒体后添加它。
我尝试先将我的插槽声明为私有,然后再声明为公共 - 无论哪种方式,它都不会被调用。
这么简单的事情这么难,真让人沮丧。
【问题讨论】:
你在哪个平台上? 【参考方案1】:走“无外部库”路线可能只会导致更多的头痛和不必要的工作。使用已建立的库的另一个优点是您不会被绑定到一种文件格式,因为并非所有格式都以相同的方式存储它们的数据。如果音频格式未压缩(wav 或其他),您可以读取标头,直到获得数据块。这个问题的答案here 在 C 中详细说明了这一点。您应该能够从中了解文件格式以将其应用于另一种语言。
在对数据进行任何有价值的操作之前,您需要了解 wav 文件中有多少个通道、位深度以及采样率。所有这些信息都可以从标题中获取。
【讨论】:
是的,原始音频比大多数人想象的要复杂得多。您想要一个由一直使用它的人提供的外部库。【参考方案2】:事实证明,QAudioProbe
在 OSX 上不受支持——我正在使用的平台。花了相当长的时间(“Qt while.. .”)来找出这些信息,所以我在这里明确地发布它。
完整详情请参阅此文档:Qt 5.5.0 Multimedia Backends
【讨论】:
以上是关于从音频(或视频)文件生成波形?的主要内容,如果未能解决你的问题,请参考以下文章