android的媒体记录器与iOS的AVAudioRecorder的输出相匹配所需的放大因子是多少?

时间:2019-10-10 14:33:49

标签: android ios audio audio-recording audio-processing

我有一个跨平台(iOS和Android)应用程序,我将在其中录制音频剪辑,然后将其发送到服务器以进行一些机器学习操作。在我的iOS应用中,我使用AVAudioRecorder录制音频。在Android应用程序中,我使用MediaRecorder录制音频。最初在移动设备中,由于尺寸限制,我使用m4a格式。到达服务器后,我将其转换为wav格式,然后在ML操作中使用它。

我的问题是,在iOS中,默认情况下,OS的AVAudioRecorder在我们开发人员访问原始数据之前会对原始音频数据进行放大。但是在Android中,MediaRecorder不会为原始数据提供任何类型的默认放大。换句话说,在iOS中,我永远不会从麦克风中获取原始音频流,而在Android中,我永远只会从麦克风中获取原始音频流。如果您可以在iPhone和Android手机上以相同的音频源并排录制相同的音频,然后以Audacity格式导入录制的音频以进行可视化表示,则这种区别显而易见。我在下面附上了一个示例表示截图。

enter image description here

在图像中,第一个轨道是Android录音,第二个轨道是iOS录音。当我通过耳机听到这两个音频时,我可以模糊地分辨它们,但是当我可视化数据点时,您可以清楚地看到图像的差异。这些区别对ML操作不利。

很明显,在iPhone中,涉及到某些放大因子,我也想在Android中实现。

有人知道放大倍数吗?还是还有其他可能的选择?

1 个答案:

答案 0 :(得分:1)

很有可能区别在于自动增益控制的效果。

您可以通过将其模式设置为AVAudioSession来在应用程序的AVAudioSessionModeMeasurement中禁用此功能,通常在启动时在应用程序中执行一次。这将禁用大量输入信号处理。

阅读问题描述,最好在Android上启用AGC。

如果这些都不产生结果,则您可能希望对两个信号都进行缩放,以使其仅在削波以下。

let audioSession = AVAudioSession.sharedInstance()

audio.session.setMode(AVAudioSessionModeMeasurement)