2010-04-25 57 views

回答

6

你可以學習使用這種方式的聲音文件的持續時間(即VitalyVal的第二種方式):

import java.net.URL; 

     import javax.sound.sampled.AudioFormat; 
     import javax.sound.sampled.AudioInputStream; 
     import javax.sound.sampled.AudioSystem; 
     import javax.sound.sampled.Clip; 
     import javax.sound.sampled.DataLine; 

     public class SoundUtils { 
      public static double getLength(String path) throws Exception { 
       AudioInputStream stream; 
       stream = AudioSystem.getAudioInputStream(new URL(path)); 
       AudioFormat format = stream.getFormat(); 
       if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { 
        format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format 
          .getSampleRate(), format.getSampleSizeInBits() * 2, format 
          .getChannels(), format.getFrameSize() * 2, format 
          .getFrameRate(), true); // big endian 
        stream = AudioSystem.getAudioInputStream(format, stream); 
       } 
       DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), 
         ((int) stream.getFrameLength() * format.getFrameSize())); 
       Clip clip = (Clip) AudioSystem.getLine(info); 
       clip.close(); 
       return clip.getBufferSize() 
         /(clip.getFormat().getFrameSize() * clip.getFormat() 
           .getFrameRate()); 
      } 

      public static void main(String[] args) { 
       try { 

        System.out 
          .println(getLength("...")); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

     } 
1

我不熟悉Java媒體框架,但可能下面會有所幫助:

1)理論上可以從「事實」塊得到一個wav文件的時間。但我懷疑,JMF可以直接訪問該塊。此外,該塊可能包含不正確的值。

2)您可以計算持續時間,瞭解音頻數據大小(以字節爲單位)和採樣率(或比特率)。

+0

請您舉個具體的例子嗎? – yasemin 2010-04-25 21:05:30

+1

恐怕,我不確定你的意思是「具體的例子」。正如我所說我不熟悉JMF。而且,至於第1)點,您只需要讀取RIFF-WAV文件規格。至於點2:持續時間(以秒爲單位)= data_size/block_align/samplerate。我想說的 - 只有兩種可能的常用方法來確定wav文件的持續時間,而不需要解壓縮。 – VitalyVal 2010-04-25 21:33:25

4

我試圖接受的答案,但得到的異常與它之後,我決定只做到這一點簡單的方法。

如果您有幾條基本信息,您可以繪製音頻數據的長度。主要作品有:

  • 採樣率
  • 樣品尺寸(每個樣品位)
  • 文件大小渠道
  • 號(單聲道/立體聲)

如果您有這些,你可以找出持續時間。 Java很好,因爲它提供的庫可以輕鬆檢索所有這些信息。方程是下面:

採樣率*樣品尺寸*持續時間*通道數=文件大小

見下面的代碼執行此計算中的java:

public static double getDurationOfWavInSeconds(File file) 
{ 
    AudioInputStream stream = null; 

    try 
    { 
     stream = AudioSystem.getAudioInputStream(file); 

     AudioFormat format = stream.getFormat(); 

     return file.length()/format.getSampleRate()/(format.getSampleSizeInBits()/8.0)/format.getChannels(); 
    } 
    catch (Exception e) 
    { 
     // log an error 
     return -1; 
    } 
    finally 
    { 
     try { stream.close(); } catch (Exception ex) { } 
    } 
} 

希望這有助於有人在那裏!不過,我只用WAV文件測試過它。

+0

當音頻採用壓縮格式時,您需要在@ibrahimyilmaz的解決方案中顯示詳細信息。例如,如果文件是MP3文件,那麼使用'file.length()'就會導致錯誤的長度。 – metasim 2012-06-17 13:22:09