从AudioInputStream编写.wav文件时,Windows Media Player无法播放

时间:2014-02-13 05:26:51

标签: java audio wav windows-media-player

我正在尝试从AudioInputStream写一个文件。流可以正常读取原始文件(据我所知)。但是当它尝试写入时,它会写入44字节的15 KB文件。 Windows Media Player提供错误“文件类型不受支持,或者WMP无法识别用于转换文件的编解码器”。

我从http://docs.oracle.com/javase/tutorial/sound/converters.html获得了大部分代码。我看了很多StackOverflow,但似乎没有任何关于这个问题。

我试过获取AudioInputStream的格式,它绝对是.wav。据我所知,编解码器是将模拟数据转换为数字数据的软件,wav文件和AudioInputStream都已经是数字化的。

编辑:看起来流正在将WAVE文件头写入我的新文件,但没有别的。这就是我的44字节文件的来源。

这是代码。我认为问题出在writeFile()中,但我将其余部分包括在内以防万一:

public static void getFile()
{
    try
    {
    File test = new File("C:\\Users\\Audrey\\Steganography\\correctamundo.wav"); //file to be written from
    AudioInputStream stream = AudioSystem.getAudioInputStream(test);
    AudioFileFormat format = AudioSystem.getAudioFileFormat(test);
    int bytesPerFrame = stream.getFormat().getFrameSize();
    byte[] b = new byte[30000]; //array of arbitrary size to hold the bytes in stream

    if (bytesPerFrame == AudioSystem.NOT_SPECIFIED) //not sure why this is necessary
       {
           bytesPerFrame = 1;
       } 
    int i = 0;

    while(stream.available() > 0)
    {
        byte currentByte = (byte)stream.read();
        b[i] = currentByte; //read bytes to array
        System.out.println(b[i] + "   " +(i+1)); //test statement
        i++;
    }

    writeFile(format, stream);

    } catch (IOException | UnsupportedAudioFileException e)
    {
        e.printStackTrace();
    }
}

public static void writeFile (AudioFileFormat format, AudioInputStream stream) //format and stream created in getFile() under the same names
{
    try
     {
         File fileOut = new File("C:\\Users\\Audrey\\Steganography\\testFile2.wav"); 
         AudioFileFormat.Type fileType = format.getType(); //type of file the AudioInputStream can write to, since format refers to stream

         if (AudioSystem.isFileTypeSupported(fileType, stream)) 
         {
             AudioSystem.write(stream, fileType, fileOut);
             System.out.println(stream.getFrameLength()); //test statement
         }
         System.out.println(fileType); //test statement
     }
     catch (IOException e)
     {
         e.printStackTrace();
     }
}

0 个答案:

没有答案