如何使用AudioTrack分别播放左右声道?

时间:2012-01-08 23:24:42

标签: android audio audiotrack

首先,我需要在运行中生成2个正弦波音,它们具有相同的频率,但相位相反,并且在Android上以立体声模式分别播放到右声道和左声道。播放需要完全同步,以便左右声道的正弦被“镜像”(当左声道有,例如120,右声道的样本值应为-120)。

问题是我没有找到任何证据证明这种设置是如何工作的。是否有可能将2个单独的音调/采样缓冲区馈送到AudioTrack以分别同时在左右声道播放?如果没有,那么实现最终结果的任何其他解决方案都非常受欢迎。

我想一个选择是使用预先生成的立体声波文件并使用AudioTrack流式传输,但这对于解决方案来说似乎太不灵活了。同时,如果AudioTrack能够以“真实”立体声模式播放这些预先录制的音频文件,我希望生成的声音也能实现相同的效果。

2 个答案:

答案 0 :(得分:5)

AudioTrack与SoundPool具有相同的方法。它打电话

AudioTrack.setStereoVolume();

如果您想使用不同的数据同时播放左/右声道。您应该处理数据以满足此目标。如果选择16Bit PCM的立体声模式,则数据左边为一个字节,右边为一个字节。例如:

左声道要玩:12,23,34,45

右声道要播放:54,43,32,21与左声道同时播放。

数据应生成为:{12,54,23,43,34,32,45,21}

然后,使用AudioTrack.write(数据)。它将完美地满足您的目标。

答案 1 :(得分:0)

好的,这可能有效,因为只有两个样本。

首先检查SoundPool。当你的曲目需要良好的性能时它很有用,因为它们完全加载到内存中。然而,这确实具有其缺点,主要的缺点是存储在存储器中的轨道的大小的限制。当我第一次使用它时,我尝试将2 x 4Mb文件放入流中 - 这不是一个好主意。

SoundPool具有此功能:

setVolume(int streamID, float leftVolume, float rightVolume)

请注意如何为每个流设置左右音量?对于流1,您可以有一个最大的左侧音量,然后对于流2,最大的右侧音量。

我会根据需要设置要播放的文件和音量,然后播放它们。

可以在http://www.vogella.de/articles/AndroidMedia/article.html

找到一个简单的教程
相关问题