2014-05-16 18 views
0

我想要做的是从音频文件生成10秒片段,并在过程中将它们转换为WAV。我正在使用javazoom vorbisspi和mp3spi库。它适用于mp3和WAV文件,但不适用于.ogg文件。虽然列为可用格式,但将ogg转换为wav无法正常工作

我试图列出我想要的编码(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文件,但不能由任何播放器播放。

回答

0

我发现了一个解决方案:暂时写入一个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); 
     }  
0

一个快速的搜索结果显示.ogg是一个容器格式。这意味着里面的数据可以使用不同的编解码器进行编码。所以你使用的文件不受支持的编解码器。

相关问题