2015-11-03 22 views
0

我正在努力嘗試從麥克風錄製文件,同時爲音量計採樣audioInputStream。我無法計算如何將流/樣本保存到文件中,同時緩衝用於測量的樣本。下面是一些代碼片段:將聲音從麥克風錄製到帶有Java聲音計量器的文件中

format = new AudioFormat(11025, 16, 1, true, true); 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
    TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info); 
    line.open(format); 
    line.start(); // start capturing 
    in = new AudioInputStream(line); 

我然後啓動一個線程來捕獲樣本:

   int bytesRead = in.read(buffer, readPoint, buffer.length - readPoint); 
       if (bytesRead == -1) { 
        notYetEOF = false; 
        break; 
       } 

       int leftover = bytesRead % frameSize; 
       calculateRMSLevel(buffer, readPoint, leftover); 
       ... 

這裏就是我卡住了。我知道我不能只用:

   AudioSystem.write(in, fileType, file); 

,因爲它當然會捕捉到文件,但是這永遠不會回來,因爲麥克風流沒有關閉。我嘗試過嘗試將byte []數據更改爲AudioInputStream而不成功的各種方法。

那麼,如何在同步(或更好的異步)保存到麥克風的wav文件輸入時採集採樣數據?

回答

1

您最好的選擇可能是簡單的原始音頻數據轉儲到tempFile,一旦你完成錄音後,將其轉換成波是這樣的:

final AudioInputStream in = new AudioInputStream(
     new FileInputStream(tempFile), 
     format, 
     tempFile.length()/format.getFrameSize() 
); 
AudioSystem.write(in, AudioFileFormat.Type.WAVE, file); 
in.close(); 

wave format規定在其塊一定規模的信息是所有數據都已經到達,真正只能寫。這使得從流中不斷寫作有點困難。它根本不是爲了這樣做。

+1

是的!這樣可行! –

相關問題