簡體   English   中英

JavaSound 用流寫入音頻文件

[英]JavaSound writing to audio file with a stream

我正在嘗試使用 JavaSound API 創建音頻過濾器來讀取和寫入音頻文件。 目前我的代碼結構如下:

        ByteArrayOutputStream b_out = new ByteArrayOutputStream();

        // Read a frame from the file.
        while (audioInputStream.read(audioBytes) != -1) {   
            //Do stuff here....
            b_out.write(outputvalue);
        }   

        // Hook output stream to output file
        ByteArrayInputStream b_in   = new ByteArrayInputStream(b_out.toByteArray());
        AudioInputStream     ais    = new AudioInputStream(b_in, format, length);
        AudioSystem.write(ais, inFileFormat.getType(), outputFile);

這將輸入文件作為流讀取,對其進行處理並將其寫入 bytearrayoutputstream,但它會等到整個文件被處理后再寫入磁盤。 理想情況下,我希望它在處理每個樣本時將其寫入磁盤。 我已經嘗試了幾種流結構的組合,但找不到一種方法,因為 AudioSystem.write() 需要一個輸入流。 有任何想法嗎?

kasperjj 的回答是正確的。 您可能正在處理 WAV 文件。 查看波形文件的布局。 請注意,整個 WAV 文件的大小在其標頭中進行編碼。

我不知道這是否適用於您的情況,但要按照您的描述處理 WAV 樣本,您可以使用“常規”非音頻 Java 輸出流。 例如,您可以使用 FileOutputStream 將它們寫入臨時文件,處理后您可以將臨時文件轉換為有效的 WAV 文件。

某些音頻格式需要在其標頭中描述流長度(或塊數)的元數據,因此無法在整個數據集出現之前開始寫入數據。 為了讓 Java 聲音 API 使用相同的 API 處理所有格式,我懷疑他們必須故意強加這個限制。

然而,有許多音頻格式可以輕松流式傳輸。 他們中的許多人都有 java 的開放庫實現,所以如果你願意添加一個外部庫,它應該不難實現。

如果您重新實現 AudioSystem.write 方法,則可以解決該問題。 它不適用於流和 WAVE 格式。 您應該從 AudioInputStream 讀取數據,將其緩存在字節數組中,處理數組並記錄到波形文件。 我建議您檢查示例中的類: How to record audio to byte array

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM