我正在尝试从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();
}
}