在 C++ 中录制时从设备获取声级

Posted

技术标签:

【中文标题】在 C++ 中录制时从设备获取声级【英文标题】:Get sound level from device while recording in C++ 【发布时间】:2010-10-10 16:42:10 【问题描述】:

我想获得声级,所以我可以在录制声音时在我的 SDL 应用程序(平台是 Linux)中显示它。我怎样才能做到这一点?我在我的应用程序中使用 FMOD API,但为了录制,我使用 SoX(分叉并使用 exec() 来设置它 - 可能这可以做得更好,但我不知道如何:()。我应该使用一些SoX、FMOD API的函数,或者直接访问/dev/dsp获取声音数据?

【问题讨论】:

【参考方案1】:

如果您愿意,您可以在 FMOD 中进行录制。可以使用 FMOD API,例如 System::recordStart 和 System::getRecordDriverInfo。 FMOD 提供了记录示例,您可以将其用作解决方案的基础。

特别是为了获取声音级别,如果您想将它作为运行时的事情来做,您可以使用 Channel::getWaveData 它将为您提供当前正在播放的音频的快照,为此您需要播放录音数据。

或者,如果没有播放,您也可以使用 Sound::lock / Sound::unlock 来访问录制的声音数据。

一旦您可以通过任一方法访问声音数据,您就可以读取这些值以获取声级/峰值信息。

【讨论】:

我尝试使用 FMOD,但我想即时获得 MP3 编码,据我了解,它在 Linux flatform 上的 FMOD 中不起作用。 FMOD 无法在编码方面提供帮助,通过使用 Sound::lock 和 unlock 您可以访问原始 PCM。如果您想将这些数据块提供给 lame 之类的东西,那绝对可以生成 MP3,但 FMOD 没有内置的编码支持。【参考方案2】:

不,至少您应该使用“安全”的 ALSA API。但是您应该考虑使用更高级别的东西,例如 Gstreamer 或 PulseAudio。

【讨论】:

以上是关于在 C++ 中录制时从设备获取声级的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ (Windows) 中选择录制设备

可以在 iPhone 设备屏幕关闭模式下录制视频吗?

在设备位置关闭时从 Google Play 服务获取最后一个已知位置

DBA与DB的区别是啥

想要在设备离线时将数据存储在本地数据库中,并在在线时从数据库中获取并发送到服务器

仅当音频高于特定声级时如何录制音频?