用于从二进制文件写入wav文件的简单Java库

时间:2013-04-04 16:47:44

标签: java wav wave sin riff

我应该在java中实现一个sin-generator。作为输入,您可以给出频率,放大和相位,并且作为输出,应该生成.wav文件。

private static byte[] generateSineWavefreq(int frequencyOfSignal, int seconds) {
    // total samples = (duration in second) * (samples per second)
    byte[] sin = new byte[seconds * sampleRate];
    double samplingInterval = (double) (sampleRate / frequencyOfSignal);
    System.out.println("Sampling Frequency  : "+sampleRate);
    System.out.println("Frequency of Signal : "+frequencyOfSignal);
    System.out.println("Sampling Interval   : "+samplingInterval);
    for (int i = 0; i < sin.length; i++) {
        double angle = (2.0 * Math.PI * i) / samplingInterval;
        sin[i] = (byte) (Math.sin(angle) * 127);
        //System.out.println("" + sin[i]);
    }
    return sin;
}

我生成了这样的窦,但是我在创建一个.wav方面存在很大的问题。我尝试了一些库,但特别是标题让我很头疼。

关于如何轻松实现这一点的任何想法?

1 个答案:

答案 0 :(得分:3)

“手动”编写文件很简单。 WAV header 并不复杂。您知道必要的信息(采样率,持续时间等),然后只是使用BufferedOutputStream将它们写入文件中。

BufferedOutputStream output = ...
// initialization
...

byte[] toWrite  = new byte[] {'R','I','F','F'};
output.write(toWrite, toWrite.length, 0);
...

但请记住,有些字段是小端和其他大端。制作一些方法,如:

byte[] getLittleEndian(int number) {

}

byte[] getBigEndian(int number) {

}