2017-09-13 116 views
0

我正在使用Java中的音樂可視化工具,但我遇到了一個概念性問題,我遇到了麻煩。我的程序成功地讀取了音頻,並且已經算出了數學運算/繪圖函數,但是我的問題是確定如何設置我的方法,以便我的程序在音頻播放時繪製視覺分析音頻文件java

這是我的代碼用於讀取音頻(後一行被創建,並AudioInputSystem,保存爲AIS,被稱爲與getAudioInputStream文件)一個片斷:

byte[] data = new byte[EXT_BUFF_SIZE]; 
int bytesRead =0; 
while(bytesRead!= -1){ 
    try{ 
     bytesRead = ais.read(data,0,data.length); 
    }catch(IOException e){e.printStackTrace();} 
    if(bytesRead>0){ 
     int bytesWritten = line.write(data,0,bytesRead); 
    } 
} 
line.drain(); 
line.close(); 

我我試圖在其他地方呼叫其他功能,或嘗試無效。我也希望可以把它放在line.write()之前,但它不會。

似乎唯一的解決方案是調用文件增量的讀取和寫入功能,而不是整個事情,但恐怕會造成播放中斷。這是我第一次在這裏發佈,經過很多潛伏之後,希望我在解釋我的問題時足夠詳細。如果沒有,我會最後一次嘗試:如何組織一個程序來讀取一個音頻文件,然後對文件進行一系列算術運算,看起來兩者同時發生(或者它們可能同時使用Thread調度或我不能完全弄清楚)?預先感謝任何和所有幫助!

+0

「恐怕這會造成間斷......」請嘗試征服你的恐懼並在有真正問題時回來。 – Kayaman

+0

「......在創建一行後......」「line」是表示「行級音頻輸出設備」的變量的名稱? – geneSummons

+0

對不起,我應該包含更多的代碼。 Line是一個SourceDataLine,它是從文件讀取和寫入數據的內容。我不明白的是SourceDataLine如何讀取**和**,並且不清楚播放的起始位置。 Kayaman,我在這裏讀了很多關於功能如何工作的問題,而不是簡單地修復錯誤。抱歉浪費你的時間。 – Scott

回答

0

您應該能夠像音頻驅動程序處理音頻流一樣以特定大小的「區塊」處理和回放音頻文件。 (每塊大小爲128,256,512等樣本)每個塊的更多樣本意味着在音頻播放器準備好接下來的音頻樣本塊之前每個塊的「可視化處理」時間更多。您可以嘗試使用塊大小,以在足夠的可視化處理時間和無故障回放之間找到平衡。