Java Sound Api:在磁盘上保存录制后Wav文件无法播放

时间:2011-10-26 16:42:16

标签: java audio javasound

我正在从麦克风录制声音并将其作为.wav文件保存到磁盘。

我无法使用Media Player播放wav文件?这是正常的吗?

AudioFormat format = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                44100.0F, 16, 2, 4, 44100.0F, false);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object

    // Obtain and open the line.
    try {
        targetLine = (TargetDataLine) AudioSystem.getLine(info);
        targetLine.open(format);
        targetLine.start();
        ByteArrayOutputStream out  = new ByteArrayOutputStream();
        int numBytesRead;
        byte[] data = new byte[targetLine.getBufferSize() / 5];

        targetLine.start();

        while (recording) {
           numBytesRead =  targetLine.read(data, 0, data.length);
           out.write(data, 0, numBytesRead);
           System.out.println(Arrays.toString(data));
        }     


        File fileOut = new File("C:\\audio\\audio6.wav");
        AudioInputStream ais = new AudioInputStream(targetLine);

        if (AudioSystem. isFileTypeSupported(AudioFileFormat.Type.WAVE,ais)) {
            AudioSystem.write(ais, AudioFileFormat.Type.WAVE, fileOut);
            System.out.println("writen");
        }   
        targetLine.stop();

        ais.close();

2 个答案:

答案 0 :(得分:0)

如果文件正常,您应该可以在媒体播放器中播放该文件。

我建议您获取免费音频编辑器Audacity(http://audacity.sourceforge.net/)的副本并查看数据。 首先检查文件中是否有一些数据,然后检查是否有正确的字节序,位深度和采样率(切换并查看是否有任何明显的噪音)。

如果这不起作用,请尝试从文件而不是Mic中读取一些样本,然后检查它们是否相同,当它们来到另一端时。

如果您还没有找到它,那么这对Java Audio来说是一个很好的资源 http://www.jsresources.org/

答案 1 :(得分:0)

您正在将记录的数据加载到ByteArrayOutputStream中,然后再对其进行任何操作(正如Jon Skeet所指出的那样)。

当“recording”布尔值为false时,那么您是否将TargetDataLine附加到AudioInputStream?但如果录音是假的,那么我假设没有数据通过TDL。数据通过read()方法从TDL获得,并且在while循环内。

我认为可以通过ByteArrayInputStream创建一个AIS,它可以从你用来从TDL收集数据的ByteArrayOutputStream中创建。

因此,在记录布尔值变为假之后,尝试以这种方式制作AIS:

ByteArrayInputStream bais = new ByteArrayInputStream(out.toByteArray());
AudioInputStream ais = new AudioInputStream(bais, format, baos.size());