私がやろうとしているのは、オーディオ ファイルから 10 秒のスニペットを生成し、その過程でそれらを WAV に変換することです。javazoom vorbisspi および mp3spi ライブラリを使用しています。mp3 および WAV ファイルでは機能しますが、.ogg ファイルでは機能しません。
必要なエンコーディング(PCM署名)で使用可能なターゲット形式をリストしてみましたが、奇妙なことに、mp3ファイルの場合、使用可能な形式のリストは空で(機能しますが)、oggファイルのリストには必要なPCMエンコーディングが表示されます(ただし、そうではありません動作しません)。ただし、.ogg ファイルの再生は機能します。これが私のコードです:
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 ファイルが生成されますが、どのプレーヤーでも再生できません。