2012-08-25 70 views
2

我有一個.wav文件。我想從該聲音文件中獲取PCM數據,以便從聲音中獲取各個數據塊並對其進行處理。如何從wav文件中獲取PCM數據?

但我不知道該怎麼做。誰能告訴我該怎麼做? 到目前爲止,我已經做到了這一點:

public class test 
{ 

    static int frameSample; 
    static int timeofFrame; 
    static int N; 
    static int runTimes; 
    static int bps; 
    static int channels; 
    static double times; 
    static int bufSize; 
    static int frameSize; 
    static int frameRate; 
    static long length; 

    public static void main(String[] args) 
    { 
     try 
     { 
      AudioInputStream ais = AudioSystem.getAudioInputStream(new File("music/audio.wav")); 
      AudioInputStream a; 
      int numBytes = ais.available(); 
      System.out.println("numbytes: "+numBytes); 
      byte[] buffer = new byte[numBytes]; 
      byte[] buffer1=new byte[numBytes] ; 
      int k=0; 
      int count=0; 
      while(count!=-1){ 
       count=ais.read(buffer, 0, numBytes); 
      } 
      long value = 0; 

      for (int i = 0; i < buffer.length; i++) 
      { 
       value = ((long) buffer[i] & 0xffL) << (8 * i); 
       System.out.println("value: "+value); 
      } 
     } catch(Exception e) { 

     } 
    } 
} 
+0

你想用Java或J做這個嗎?在你提出問題之前,我從未聽說過'J',並懷疑你的意思是Java。 –

+0

對不起。我不是指j。我想用java來做。再次抱歉。 – Pallab

回答

5

這可以用Java Sound API來完成。

  • 使用AudioSystem來從文件中AudioInputStream
  • 查詢流爲AudioFormat
  • 創建一個byte[]以適應格式。例如。 8位單聲道是byte[1]。 16位立體聲是byte[4]
  • byte[]的塊形式讀取流,它將逐幀包含聲音。
  • 繼續進一步處理..
+1

我已經完成了這項工作。它是否正確?我想從字節中收集整數值。代碼是與問題。 – Pallab

+0

請爲代碼塊使用一致的邏輯縮進。請注意,這些框架是「單個數據塊」,因此您的問題已得到解答。你應該問一個單獨的問題,如何將幀變成一個int(單聲道)或一對ints(立體聲)。 –

+0

你能告訴我我怎樣才能從wav中分離出頭文件?請告訴我。 – Pallab