Преобразование ogg в wav не работает, хотя указано как доступный формат

Я пытаюсь создать 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 создается, но не может воспроизводиться ни одним плеером.


person Moriz Büsing    schedule 16.05.2014    source источник


Ответы (2)


Я нашел решение: временно записать в файл 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);
        }    
person Moriz Büsing    schedule 16.05.2014

Быстрый поиск в Google показывает, что .ogg - это контейнерный формат. Это означает, что данные внутри можно кодировать с помощью разных кодеков. Итак, файл вы используете неподдерживаемый кодек.

person user3224416    schedule 16.05.2014