我使用Java的SourceDataLine播放聲音,但每當我嘗試調整音量(增益)時,動作與揚聲器中的響應之間會有0.2-0.5秒的延遲。音頻數據以4k-16k塊(16bit單聲道,22kHz〜44k/s)寫入。實時Java音量調整
如何使此音量調整更實時?
write(byte[], int, int)
是否鎖定了FloatControl的增益調整?
我是否需要恢復到DSP並行調整聲音緩衝區數據量的方式或提交更小的塊?
JDK7,體面的Windows PC
我使用Java的SourceDataLine播放聲音,但每當我嘗試調整音量(增益)時,動作與揚聲器中的響應之間會有0.2-0.5秒的延遲。音頻數據以4k-16k塊(16bit單聲道,22kHz〜44k/s)寫入。實時Java音量調整
如何使此音量調整更實時?
write(byte[], int, int)
是否鎖定了FloatControl的增益調整?
我是否需要恢復到DSP並行調整聲音緩衝區數據量的方式或提交更小的塊?
JDK7,體面的Windows PC
音響系統從SourceDataLine的數據在數(百元... ...)千字節的塊和緩衝它們。如果您更改參數,它將不會生效,直到系統播放緩衝區爲空,並從SDL讀取新數據。
你需要做的是繞着改變系統播放音量(它立即生效)而不是對你提供給它的數據進行調試。
與系統的主音量混淆似乎不是一個好方法,因爲我想我會需要JNI/JNA來做到這一點。我個人討厭這樣做的應用程序。另外,我必須在不同的音量設置下同時播放音樂和其他聲音。 – akarnokd 2009-07-29 10:41:56
如果您可以以某種方式影響/創建您的調音臺爲Line
包含的Line.Info
類,則可以更改其最小和最大緩衝區。然後,你可以將緩衝區設置爲你正在餵它的塊的大小,然後你的延遲將減少到無(據推測)
當你調用SourceDataLine.open()時,你是否嘗試過使用自定義(較低)緩衝區大小)?
SourceDataLine.open(AudioFormat format, int bufferSize)
這應該會減少延遲。主播放音量解決方案仍然可能會更快。
不是我一直在尋找的答案,但似乎我不得不回到Java解決方案的Java遊戲開發書籍。 – akarnokd 2009-08-11 21:31:42