【问题标题】:How to play left and right channel separately with AudioTrack?如何用 AudioTrack 分别播放左右声道?
【发布时间】:2012-01-08 23:24:41
【问题描述】:

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

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

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

【问题讨论】:

  • 感谢 android 开发者用户组中的 niko20:“您不需要左右单独的缓冲区。立体声音频是交错的。要输出立体声,您只需用左右填充缓冲区”。这实际上效果很好,用 AudioTrack 测试过

标签: android audio audiotrack


【解决方案1】:

AudioTrack 的方法与 SoundPool 相同。它调用

AudioTrack.setStereoVolume();

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

左声道要播放:12、23、34、45

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

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

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

【讨论】:

  • 这是正确的吗?我是否必须将每个通道的一个元素沿输出缓冲区互换?
  • 我正在尝试为单声道音频做单声道,但我发现它现在由 public int setVolume (float gain) 完成 API 级别 21 中添加 在所有声道上设置指定的输出增益值这条赛道的。这个 API 比 setStereoVolume(float, float) 更受欢迎,因为它可以更优雅地缩小到单声道,并扩展到立体声以外的多声道内容。那我现在怎么控制呢?
【解决方案2】:

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

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

SoundPool 有这个功能:

setVolume(int streamID, float leftVolume, float rightVolume)

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

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

一个简单的教程可以在http://www.vogella.de/articles/AndroidMedia/article.html找到

【讨论】:

  • 好的,我明白你的意思,但不幸的是,SoundPool 对我没有多大帮助,因为我需要在我的代码中生成声音并使用 AudioTrack 和 MODE_STREAM 来动态提供播放缓冲区。 AudioTrack 支持 CHANNEL_OUT_MONO 和 CHANNEL_OUT_STEREO 配置,但我还没有找到将不同代码生成的声音实际馈送到左右声道的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多