尽管列为可用格式,但将 ogg 转换为 wav 不起作用

Posted

技术标签:

【中文标题】尽管列为可用格式,但将 ogg 转换为 wav 不起作用【英文标题】:Converting ogg to wav doesn't work although listed as available format 【发布时间】:2014-07-05 06:20:37 【问题描述】:

我要做的是从音频文件生成 10 秒的 sn-ps,并在此过程中将它们转换为 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 文件,但任何播放器都无法播放。

【问题讨论】:

【参考方案1】:

快速谷歌搜索表明 .ogg 是一种容器格式。这意味着内部的数据可以使用不同的编解码器进行编码。所以你使用的文件不支持编解码器。

【讨论】:

【参考方案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);
            

【讨论】:

以上是关于尽管列为可用格式,但将 ogg 转换为 wav 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

请问MP3 OGG WMA WMV WAV 和AAC格式之间有啥区别啊

在 .NET 中将 Opus (.ogg) 转换为 PCM (.wav)

如何使用某些控制台实用程序将目录中的 .ogg 文件转换为 .wav 文件 [重复]

天啊!跪求用Exact Audio Copy把CD转化为OGG格式的音乐?

在 WP8 中将 ogg 文件解码为 wav

ffmpeg 如何转换其他格式的音频文件?