【问题标题】:Android SoundPool Cannot Play Through Single ChannelAndroid SoundPool 无法通过单通道播放
【发布时间】:2017-10-04 21:46:51
【问题描述】:

我们正在通过 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、三星 Note 和 LG。似乎没有任何效果。什么给了?

【问题讨论】:

    标签: android audio xamarin wav


    【解决方案1】:

    此“功能”是所有 Android.Media.* 包媒体输出中固有的,并且由于 Android 音频堆栈,它发生在物理和模拟设备上,因为 Android 支持多达 8 通道音频和混音 em> 产生音频输出的所有可用通道。

    即如果您创建的 AudioFormat 屏蔽了除右声道之外的所有声道,那么无论AudioAttributes 是什么,您仍然会在左声道上有一些输出(假设您使用的是 2 声道输出设备):

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

    这些API在AudioFlingerlibmediaHAL等之上...因此受制于FastMixer/NormalMixer/AudioMixer等提供的最终混音...

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

    【讨论】:

    • 感谢您的回答。我们最终通过修改我们的硬件来“修复”这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2016-05-17
    • 2021-12-14
    相关资源
    最近更新 更多