Android SoundPool 无法通过单通道播放
Android SoundPool Cannot Play Through Single Channel
我们正在通过 Android 的 SoundPool API 播放 wav 文件。我们已经创建了一种设备,它可以通过麦克风环回其中一个立体声通道,而不是另一个。
我还应该提到,我们已经用计算机测试了我们的环回设备并确认它工作正常。
但是,当我们尝试通过未环回到麦克风的通道播放声音时,我们仍然 "hearing" 麦克风上来自该通道的声音。当我们插入耳机时,似乎 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。似乎没有任何效果。给出了什么?
此 "feature" 是所有 Android.Media.*
包媒体输出中固有的,由于 Android 音频堆栈,它发生在物理和模拟设备上 Android 最多支持 8 声道音频,混合所有可用声道以产生音频输出。
即如果您创建一个 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(开放式声音系统)以访问硬件音频服务以绕过正常的音频处理。
我们正在通过 Android 的 SoundPool API 播放 wav 文件。我们已经创建了一种设备,它可以通过麦克风环回其中一个立体声通道,而不是另一个。
我还应该提到,我们已经用计算机测试了我们的环回设备并确认它工作正常。
但是,当我们尝试通过未环回到麦克风的通道播放声音时,我们仍然 "hearing" 麦克风上来自该通道的声音。当我们插入耳机时,似乎 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。似乎没有任何效果。给出了什么?
此 "feature" 是所有 Android.Media.*
包媒体输出中固有的,由于 Android 音频堆栈,它发生在物理和模拟设备上 Android 最多支持 8 声道音频,混合所有可用声道以产生音频输出。
即如果您创建一个 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(开放式声音系统)以访问硬件音频服务以绕过正常的音频处理。