1

在 java 中,您可以像这样创建 SourceDataLine:

AudioFormat af = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100.0, 16, 1, 2, 44100.0, false);       
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);

之后,您可以打开然后将数据写入其中:

byte[] data = new byte[1024];
fillwithsounds(data);

sdl.open()
sdl.start()
sdl.write(data, 0, 1024);

这一切都适用于单声道数据。

我想做的是能够编写立体数据,我在网上找不到任何关于如何更改字节数组才能写入立体数据的文档。

似乎我需要在创建 AudioFormat 时增加通道数量 - 使其成为立体声 - 然后我需要将帧速率减半(否则 Java 会抛出 IllegalArgumentException)

我不明白为什么会这样,或者我提供给 DataSourceLine 的数据的新格式应该是什么。

也许在音频格式方面比我有更多经验的人可以对这个问题有所了解。提前致谢!

4

2 回答 2

2

我用于立体声的格式如下:

        audioFmt = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
            44100, 16, 2, 4, 44100, false);

您可能希望将每帧的字节数加倍,而不是将位编码减半。我不确定 8 位编码听起来像什么,但它肯定会比 16 位编码更嘈杂!

结果文件的长度是原来的两倍。然后,您可以获取构成 16 位样本的两字节对并将它们复制到接下来的两个位置,用于“单声道”播放(两个立体声通道相同)。

鉴于:

frame = F
little end byte = A
big end byte = B
AB = 16-bit little-endian encoding
left channel = L
right channel = R

你原来的单声道:

F1A,F1B,F2A,F2B,F3A,F3B ...

使用上述格式的立体声:

F1AL, F1BL, F1AR, F1BR, F2AL, F2BL, F2AR, F2BR, F3AL, F3BL, F3AR, F3BR ...

我很可能会混淆左右顺序。但我希望你能明白!

于 2013-06-18T19:46:47.673 回答
0

我刚刚找到了解决方案,并找到了 Andrew Thompson 的评论来准确解释我需要什么。

我想我必须每帧写两次,让我感到震惊的是 Java 不允许我只使用我的单声道通道的帧大小。(它抛出了一个 IllegalArgumentException)

所以我将帧率减半以满足Java,但我不记得修改字节数组。

我已经实现了采用“每帧 2 个字节,1 个通道”字节 [] 并将其转换为“每帧 1 个字节,2 个通道”字节 [] 的代码。

private static final float LEFT   = -1;
private static final float CENTER = 0;
private static final float RIGHT  = 1;

private byte[] monoToStereo(byte[] data, float pan){
    byte[] output = new byte[data.length];
    for (int i = 0; i < (data.length - 2); i+=2){
        int currentvalue = (data[i+1]*256 + data[i])/(256*2);
        if (pan == LEFT || pan == CENTER){
            output[i] = (byte) currentvalue;
        } else {
            output[i] = 0;
        }
        if (pan == RIGHT || pan == CENTER){
            output[i+1] = (byte) currentvalue;
        } else {
            output[i+1] = 0;
        }
    }
    return output;
}

使用它,我可以播放立体声音频(虽然有柔和的静电,但我可以清楚地听到原始音轨)

于 2013-06-18T19:06:02.523 回答