2017-07-16 114 views
0

我有一個用Java編寫的應用程序,需要播放音頻。我使用OpenAL(使用java-openal庫)進行任務,但是我想使用OpenOL直接不支持的WSOLA。我發現了一個名爲TarsosDSP的java本地庫,它支持WSOLA。支持SourceDataLine格式的問題

該庫使用標準Java API進行音頻輸出。在SourceDataLine的安裝過程中出現的問題:

IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_UNSIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian is supported. 

我確信這個問題不是由缺少權限引起的(運行它作爲在Linux +根試了一下在Windows 10),而且在不使用其他SourceDataLines該項目。

經過修改格式之後,我發現格式在從PCM_UNSIGNED更改爲PCM_SIGNED時被接受。這似乎是一個小問題,因爲只有將字節範圍表單無符號地移動到帶符號應該很容易。然而奇怪的是,它不是本地支持的。

那麼,有沒有一些解決方案,我不需要修改源數據?

謝謝,1月

回答

1

您不必手動移動字節範圍。在創建AudioInputStream之後,您將創建另一個帶有簽名格式並連接到第一個未簽名流的AudioInputStream。如果您使用簽名流讀取數據,Sound API會自動轉換格式。這樣你就不需要修改源數據。

File fileWithUnsignedFormat; 

AudioInputStream sourceInputStream; 
AudioInputStream targetInputStream; 

AudioFormat sourceFormat; 
AudioFormat targetFormat; 

SourceDataLine sourceDataLine; 

sourceInputStream = AudioSystem.getAudioInputStream(fileWithUnsignedFormat); 
sourceFormat = sourceInputStream.getFormat(); 

targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
    sourceFormat.getSampleRate(), 
    sourceFormat.getSampleSizeInBits(), 
    sourceFormat.getChannels(), 
    sourceFormat.getFrameSize(), 
    sourceFormat.getFrameRate(), 
    false); 

targetInputStream = AudioSystem.getAudioInputStream(targetFormat, sourceInputStream); 

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, targetFormat); 
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); 

sourceDataLine.open(targetFormat); 
sourceLine.start(); 


// schematic 
targetInputStream.read(byteArray, 0, byteArray.length); 
sourceDataLine.write(byteArray, 0, byteArray.length);