2009-07-28 100 views
0

我使用Java的SourceDataLine播放聲音,但每當我嘗試調整音量(增益)時,動作與揚聲器中的響應之間會有0.2-0.5秒的延遲。音頻數據以4k-16k塊(16bit單聲道,22kHz〜44k/s)寫入。實時Java音量調整

如何使此音量調整更實時?

write(byte[], int, int)是否鎖定了FloatControl的增益調整?

我是否需要恢復到DSP並行調整聲音緩衝區數據量的方式或提交更小的塊?

JDK7,體面的Windows PC

+0

不是我一直在尋找的答案,但似乎我不得不回到Java解決方案的Java遊戲開發書籍。 – akarnokd 2009-08-11 21:31:42

回答

2

音響系統從SourceDataLine的數據在數(百元... ...)千字節的塊和緩衝它們。如果您更改參數,它將不會生效,直到系統播放緩衝區爲空,並從SDL讀取新數據。

你需要做的是繞着改變系統播放音量(它立即生效)而不是對你提供給它的數據進行調試。

+0

與系統的主音量混淆似乎不是一個好方法,因爲我想我會需要JNI/JNA來做到這一點。我個人討厭這樣做的應用程序。另外,我必須在不同的音量設置下同時播放音樂和其他聲音。 – akarnokd 2009-07-29 10:41:56

0

如果您可以以某種方式影響/創建您的調音臺爲Line包含的Line.Info類,則可以更改其最小和最大緩衝區。然後,你可以將緩衝區設置爲你正在餵它的塊的大小,然後你的延遲將減少到無(據推測)

0

當你調用SourceDataLine.open()時,你是否嘗試過使用自定義(較低)緩衝區大小)?

SourceDataLine.open(AudioFormat format, int bufferSize) 

這應該會減少延遲。主播放音量解決方案仍然可能會更快。