2

私がやろうとしているのは、オーディオ ファイルから 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 ファイルが生成されますが、どのプレーヤーでも再生できません。

4

2 に答える 2