Java 将ogg转换为wav不会';虽然列为可用格式,但不起作用
我要做的是从音频文件中生成10秒的片段,并在这个过程中将它们转换成WAV。我正在使用javazoom vorbisspi和mp3spi库。它适用于mp3和WAV文件,但不适用于.ogg文件 我尝试列出我想要的编码(PCM签名)的可用目标格式,奇怪的是,对于mp3文件,可用格式的列表是空的(尽管它可以工作),而ogg文件的列表显示了我想要的PCM编码(尽管它不工作)。不过,播放.ogg文件是可行的。这是我的密码:Java 将ogg转换为wav不会';虽然列为可用格式,但不起作用,java,audio,wav,ogg,vorbis,Java,Audio,Wav,Ogg,Vorbis,我要做的是从音频文件中生成10秒的片段,并在这个过程中将它们转换成WAV。我正在使用javazoom vorbisspi和mp3spi库。它适用于mp3和WAV文件,但不适用于.ogg文件 我尝试列出我想要的编码(PCM签名)的可用目标格式,奇怪的是,对于mp3文件,可用格式的列表是空的(尽管它可以工作),而ogg文件的列表显示了我想要的PCM编码(尽管它不工作)。不过,播放.ogg文件是可行的。这是我的密码: AudioInputStream in = null;
AudioInputStream in = null;
AudioInputStream din = null;
AudioFileFormat fileFormat = null;
AudioFormat format = null;
fileFormat = AudioSystem.getAudioFileFormat(input);
in = AudioSystem.getAudioInputStream(input);
format = in.getFormat();
float frameRate = 44100;
int channels = format.getChannels();
AudioFormat targetFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
frameRate,
16,
channels,
channels*2,
frameRate,
false
);
AudioFormat[] available = AudioSystem.getTargetFormats(
AudioFormat.Encoding.PCM_SIGNED, format);
System.out.println("------------------------------------");
System.out.println("Available for: " + format.toString());
for (AudioFormat e : available) {
System.out.println(e.toString());
}
if (AudioSystem.isConversionSupported(targetFormat, format)) {
din = AudioSystem.getAudioInputStream(targetFormat, in);
long frames = this.thumbNailLength * (long)frameRate;
AudioInputStream shortenedStream = new AudioInputStream(
din, targetFormat, frames);
AudioSystem.write(shortenedStream,
new AudioFileFormat.Type("WAVE", "wav"), outputFile);
}
else {
throw new IllegalArgumentException(
"Conversion to WAV from this format is not supported by the System.");
}
.ogg文件的输出:
[java] Available for: VORBISENC 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, unknown frame rate,
[java] PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
[java] PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian
为什么这不能像预期的那样工作?我甚至没有得到一个例外,生成了一个.wav文件,但任何播放器都不能播放。快速搜索显示.ogg是一种容器格式。这意味着内部数据可以使用不同的编解码器进行编码。因此,您使用的是不受支持的编解码器。我找到了一个解决方案:临时写入pcm文件,然后将该文件读入新的AudioInputStream。我真的不知道为什么,但它是有效的:
if (format.getEncoding().equals(new AudioFormat.Encoding("VORBISENC"))) {
byte [] buffer = new byte[4096];
int n;
FileOutputStream fos = new FileOutputStream(outputFile + ".pcm");
while(-1 != (n = din.read(buffer))) {
fos.write(buffer, 0, n);
}
fos.close();
AudioInputStream pcmIn = new AudioInputStream(new FileInputStream(outputFile + ".pcm"), targetFormat, frames);
AudioSystem.write(pcmIn, AudioFileFormat.Type.WAVE, new FileOutputStream(outputFile));
File f = new File(outputFile + ".pcm");
f.delete();
} else {
AudioInputStream shortenedStream = new AudioInputStream(din, targetFormat, frames);
AudioSystem.write(shortenedStream, new AudioFileFormat.Type("WAVE", "wav"), outputFile);
}