用Java读写.wav文件

时间:2014-10-24 18:58:53

标签: java audio wav

我对学习Java中的音频文件操作感兴趣,所以,在研究了.wav文件格式的一些背景之后,我写了一个简单的程序来读取.wav文件,把它放到一个字节数组中,然后将该数组写入新的.wav文件。但是,输出文件不是输入文件的副本。例如,当我在文本编辑器(Notepad ++)中打开两个.wav文件时,原始文件将开始说" RIFF"应该如此,但副本开始时带有一系列空字符。任何人都可以告诉我我做错了什么吗?

这是我的代码:

package funwithwavs2;

import javax.sound.sampled.*;
import java.io.*;

public class FunWithWavs2 {

public static void main(String[] args) {
    int x;
    byte[] wavBytes=new byte[100000000];

    try {
        AudioInputStream ais=AudioSystem.getAudioInputStream(new File("Centerfold.wav"));


        while((x=ais.read(wavBytes))>0) {
            System.out.println("X: "+x);
        }

        writeToFile(wavBytes);
    }
    catch (Exception ex) {
        System.err.println("Error reading WAV file.");
        ex.printStackTrace();
    }

}


public static void writeToFile(byte[] b) {
    File file=new File ("centerfold3.wav");
    try {
        if(!file.exists()) {
            file.createNewFile();
        }

        FileWriter fw=new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw=new BufferedWriter(fw);
        for(int i=0;i<b.length;i++) {
            bw.write(b[i]);
        }
        bw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

谢谢!

编辑以反映下面的评论:我将输入声明切换到下面的代码段,但它为我提供了标记/重置不支持的异常。

InputStream input=new FileInputStream("Centerfold.wav");
        AudioInputStream ais=AudioSystem.getAudioInputStream(input);

我的问题的关键是没有写入输出.wav文件。我从输入文件中读取的字节并不是我所期望的。

while((x2=ais.read(wavBytes))>0) {
            System.out.println("X2: "+x2);
        }


        for(int i=0;i<36;i++) {
            System.out.println(i+": "+wavBytes[i]);
        }

看一下这段代码,我希望打印出来的前四个字符是ASCII值:R I F F,符合.wav文件格式。然而,我得到的是一系列0,即NULL的ASCII值。为什么会出现这种差异?我是否从根本上误解了.wav文件格式或javax.sound.sampled类的功能?

0 个答案:

没有答案