【问题标题】:Save Multichannel Audio File [closed]保存多声道音频文件[关闭]
【发布时间】:2017-04-13 21:51:33
【问题描述】:

我正在尝试使用 Java Sound API 将两个数据缓冲区作为单独的通道输出到一个音频文件中。我找到了输出单声道音频的方法,但这并不是我真正想要的。我也不知道应该使用哪种音频格式(WAV、MP3 等)。我的两个数据缓冲区是从 -127 到 +127 的字节数组。

【问题讨论】:

  • 澄清一下,您是通过 Java 应用程序播放声音,还是导出/写入声音文件?当您说单独的通道时,您是否希望将缓冲区一中的数据放入立体声左侧,并将缓冲区二中的数据放入立体声右侧?还是你在说别的?

标签: java javasound


【解决方案1】:

这里有一些示例代码向您展示如何创建WAV 文件。 MP3 并没有真正被 Java 开箱即用地支持,尽管有相应的库。

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

public class StereoOutput {

    public static void main(final String[] args) throws IOException {

        // left samples - typically more than 4!!
        final byte[] left = new byte[] {1, 2, 3, 4};
        // right samples
        final byte[] right = new byte[] {1, 2, 3, 4};

        final ByteArrayInputStream interleavedStream = createInterleavedStream(left, right);

        // audio format of the stream we created
        final AudioFormat audioFormat = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                44100f, // sample rate - you didn't specify, 44.1k is typical
                8,      // how many bits per sample, i.e. per value in your byte array
                2,      // you want two channels (stereo)
                2,      // number of bytes per frame (frame == a sample for each channel)
                44100f, // frame rate
                true);  // byte order
        final int numberOfFrames = left.length; // one frame contains both a left and a right sample
        // wrap stream into AudioInputStream (data + format)
        final AudioInputStream audioStream = new AudioInputStream(interleavedStream, audioFormat, numberOfFrames);
        // write to WAV file
        AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, new File("out.wave"));
    }

    /**
     * Typically in PCM audio, left and right samples are interleaved.
     * I.e.: LR LR LR LR.
     * One LR is also called a "frame".
     *
     * @param left array with left samples
     * @param right array with right samples
     * @return stream that contains all samples in LR LR interleaved order
     */
    private static ByteArrayInputStream createInterleavedStream(final byte[] left, final byte[] right) {
        final byte[] interleaved = new byte[left.length + right.length];
        for (int i=0; i<left.length; i++) {
            interleaved[2*i] = left[i];
            interleaved[2*i+1] = right[i];
        }
        return new ByteArrayInputStream(interleaved);
    }
}

我建议您通过Java Sound Trail 工作,并查看Java API 文档以了解AudioFormat 等类。如果你不熟悉PCM,也请阅读。了解数字采样音频至关重要。

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多