Android SoundPool无法通过单个频道播放
我们正在通过Android的SoundPool API播放wav文件。我们已经发明了一种设备,可以将其中一个立体声通道通过麦克风循环,而不是另一个 我还应该提到,我们已经用计算机测试了我们的环回设备,并确认它工作正常 但是,当我们试图通过没有循环回麦克风的通道播放声音时,我们仍然在麦克风上“听到”来自该通道的声音。当我们插上耳机时,Android似乎仍在向另一个频道发送一个更安静的版本的声音,即使这是不应该的 我们试过在一个频道上播放静音的立体声WAV文件,也试过单声道声音文件——两种声音的播放方式都是一样的。有谁能解释一下这一点以及如何阻止它?我们使用的代码是:Android SoundPool无法通过单个频道播放,android,audio,xamarin,wav,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)。我们也在多个测试设备上试用过,包括谷歌像素、三星笔记本和LG。似乎什么都不管用。提供了什么?此“功能”是所有Android.Media.*
包媒体输出中固有的,由于Android音频堆栈,它发生在物理和模拟设备上,因为Android支持多达8个频道的音频,并混合所有可用频道以产生音频输出
i、 e.如果您创建的音频格式屏蔽了除右声道以外的所有声道,则无论音频属性如何,左声道仍会有一些输出(假设您使用的是双声道输出设备):
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(开放式声音系统)以访问硬件音频服务,从而绕过正常的音频处理
谢谢你的回答。我们最终通过修改硬件来“修复”这个问题。