android - 使用 android AudioTrack 在左或右扬声器中播放声音

标签 android audiotrack

我在应用程序中借助 AudioTrack 播放声音,但我想在特定扬声器/耳朵中播放声音,即左扬声器或右扬声器或两个扬声器。

我使用以下代码来播放声音。

private AudioTrack generateTone(double freqHz, int durationMs)
{
    int count = (int)(44100.0 * 2.0 * (durationMs / 1000.0)) & ~1;
    short[] samples = new short[count];
    for(int i = 0; i < count; i += 2){
        short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
        samples[i + 0] = sample;
        samples[i + 1] = sample;
    }
    AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
        AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
        count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);

    track.write(samples, 0, count);
    return track;
}

通过以下代码,我调用此函数来播放声音。

AudioTrack soundAtSpecificFrequency =   generateTone(500, 6000);
soundAtSpecificFrequency.play();

以下代码可停止播放声音。

soundAtSpecificFrequency.pause();

您能否告诉我在这种情况下可能的解决方案或任何其他替代解决方案?

感谢您宝贵的时间。

最佳答案

AudioTrack 使用原始 PCM 样本来播放声音。 PCM 样本按以下顺序播放(第一个样本由左扬声器播放,第二个样本由右扬声器播放):

LRLRLRLRLR

因此,您必须修改传递给 AudioTrack 的示例数组。

This也可以提供帮助。

根据您的情况,只需执行以下操作:

// only play sound on left
for(int i = 0; i < count; i += 2){
    short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
    samples[i + 0] = sample;
    samples[i + 1] = 0;
}
// only play sound on right
for(int i = 0; i < count; i += 2){
    short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
    samples[i + 0] = 0;
    samples[i + 1] = sample;
}

关于android - 使用 android AudioTrack 在左或右扬声器中播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27056605/

相关文章:

android - 引用 .jar 库时无法解决父类(super class)错误

android - 如何清除 Android 中的数字 editText?

android - 在 AudioTrack 上播放非阻塞数据

javascript - 将两个音轨合并为一个音轨

android - TLS Client Hello 请求在 iOS 或 Android 中包含未知版本

android - 如何更改android中操作栏标题的字体

android - 为什么按钮在 LinearLayout 中没有垂直居中?

android - AudioTrack:从一个线程开始调用

android - 在 Android 上使用 OpenSL ES 通过套接字通信流式传输 MP3 音频

java - 音调发生器产生第二音调