Android SoundPool无法通过单一频道播放

时间:2017-10-04 21:46:52

标签: android audio xamarin wav

我们通过Android的SoundPool API播放wav文件。我们创建了一个设备,通过麦克风将其中一个立体声声道循环回来,而不是另一个。

我还应该提一下,我们已经使用计算机测试了我们的环回设备,并确认它可以正常工作。

但是,当我们尝试通过未环回麦克风的声道播放声音时,我们仍然会听到"麦克风上声道的声音。当我们插入耳机时,似乎Android仍然会将一个声道版本的单声道声音发送到另一个声道,即使它不应该这样。

我们尝试过在一个频道上静音的立体声WAV文件,我们尝试过单声道文件 - 两者都播放相同。任何人都可以解释这个以及如何阻止它?我们使用的代码是:

_Pool = new SoundPool(3, Stream.Music, 0);
var beep = assets.OpenFd("beep.wav");
var beepId = _Pool.Load(beep, 1);

//later, after the sound is loaded we call:
_Pool.Play(beepId, 1, 0, 1, 0, 1);

我还应该提一下,我们尝试过音量级别的变化(0.01而不是0.0和0.99而不是1.0)。我们还在多个测试设备上尝试过它,包括Google Pixel,Samsung Note和LG。似乎没什么用。是什么给了什么?

1 个答案:

答案 0 :(得分:2)

这个"功能"是所有Android.Media.*软件包媒体输出中固有的,由于Android支持多达8个频道音频和混合所有可用频道,因此Android音频堆栈会在物理和模拟设备上发生这种情况产生音频输出。

即。如果您创建一个屏蔽除右声道以外的所有声道的AudioFormat,则无论AudioAttributes是什么,您都会在左声道上有一些输出(假设您使用的是双声道输出设备):

var audioFormat = new AudioFormat.Builder()
                .SetChannelIndexMask(2) // Right channel
                .SetSampleRate(8000)
                .SetEncoding(Encoding.Pcm16bit)
                .Build();

这些API位于AudioFlingerlibmediaHAL等之上......因此受FastMixer / NormalMixer / AudioMixer等提供的最终混音的影响。 ..

您可以查看ALSA(高级Linux声音架构)和OSS(开放式声音系统)以访问硬件音频服务,以绕过正常的音频处理。

enter image description here