2014-05-16 19 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是一個容器格式。這意味着裏面的數據可以使用不同的編解碼器進行編碼。所以你使用的文件不受支持的編解碼器。

相關問題