我们通过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。似乎没什么用。是什么给了什么?
答案 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位于AudioFlinger
,libmedia
,HAL
等之上......因此受FastMixer / NormalMixer / AudioMixer等提供的最终混音的影响。 ..
您可以查看ALSA(高级Linux声音架构)和OSS(开放式声音系统)以访问硬件音频服务,以绕过正常的音频处理。