在 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++ 中录制时从设备获取声级的主要内容,如果未能解决你的问题,请参考以下文章
在设备位置关闭时从 Google Play 服务获取最后一个已知位置