Android AudioRecord 配置与录制的音频不匹配
Android AudioRecord Configuration does not match recorded Audio
我打算在 Android 4.4.2 设备上录制立体声音频。但是,通过简单的录音应用程序(使用 AudioRecord)录制的音频与提供的配置不匹配。如果设备使用默认配置值,我希望在 logcat 中看到错误消息,但我可以看到提供的值似乎被 AudioHardware 和 AudioPolicyManagerBase 接受。
当前配置:
recorder = new AudioRecord(Media.Recorder.MIC,
sampleRate,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
audioBufferSizeInBytes);
已提出更改 Media.Recorder.AudioSource 的选项以尝试解决此问题;但这并没有改变 Android 堆栈的行为方式——除了(可以理解)在配置无效时无法加载记录器。
已表明更改采样率也不会在输出中产生明显的变化 - 44.1kHz 和 16kHz 都是有效选项,但在检查时都会产生 16kHz 音频。输出音频似乎也是一个上混为立体声的音频通道。
TinyALSA/Tinycap 可用于捕获音频,这似乎符合预期。
这可能是 Android 堆栈中的问题吗?或者这更有可能是 OEM 提供的代码的问题?
在这种情况下,音频缩混的原因是 HAL 中使用了 Speex 编解码器来缩混和降噪立体声输入。
配置如下:
<android source tree>/hardware/<OEM>/audio/audiohardware.h
这个问题的替代方案是将音频从 ALSA 路由出去,并通过 unix 域流套接字绕过 android 堆栈。这可以在应用程序层中使用 androids localSockets 访问。
我打算在 Android 4.4.2 设备上录制立体声音频。但是,通过简单的录音应用程序(使用 AudioRecord)录制的音频与提供的配置不匹配。如果设备使用默认配置值,我希望在 logcat 中看到错误消息,但我可以看到提供的值似乎被 AudioHardware 和 AudioPolicyManagerBase 接受。
当前配置:
recorder = new AudioRecord(Media.Recorder.MIC,
sampleRate,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
audioBufferSizeInBytes);
已提出更改 Media.Recorder.AudioSource 的选项以尝试解决此问题;但这并没有改变 Android 堆栈的行为方式——除了(可以理解)在配置无效时无法加载记录器。
已表明更改采样率也不会在输出中产生明显的变化 - 44.1kHz 和 16kHz 都是有效选项,但在检查时都会产生 16kHz 音频。输出音频似乎也是一个上混为立体声的音频通道。
TinyALSA/Tinycap 可用于捕获音频,这似乎符合预期。
这可能是 Android 堆栈中的问题吗?或者这更有可能是 OEM 提供的代码的问题?
在这种情况下,音频缩混的原因是 HAL 中使用了 Speex 编解码器来缩混和降噪立体声输入。
配置如下:
<android source tree>/hardware/<OEM>/audio/audiohardware.h
这个问题的替代方案是将音频从 ALSA 路由出去,并通过 unix 域流套接字绕过 android 堆栈。这可以在应用程序层中使用 androids localSockets 访问。