1)我不認爲這是安全的假設總是有一個平衡,甚至是一個MASTER_GAIN。也許有。我對Java控件的音頻使用經驗令人煩惱和短暫。我很快決定寫我自己的調音臺,並且已經這樣做了。我願意分享這些代碼。它包含處理數量和平移的基本規定。
即使它們工作,Java控件的粒度也受到所使用的緩衝區大小的限制,這嚴重限制瞭如果您嘗試淡化,您可以在不創建點擊的情況下淡入淡出。但是,設置和保持單個卷是沒有問題的。
另一個java庫(由幾個遊戲程序員在java-gaming.org上進行審查)是通過github提供的「TinySound」。我已經看過它,但沒有使用它自己。它還將所有聲音混合到單個輸出SourceDataLine。我不記得如何處理音量或平移。他列入了ogg/vorbis文件的條款。
2)我不確定你提到「樣本」時如何使用剪輯工作。是的,您可以預加載100個剪輯。您可以直接在自己的線程上播放這些剪輯(假設使用原始Java代替音頻混合庫),然後將它們重置回第0幀,然後再次播放它們。但是,一次只能有一個線程在播放給定的剪輯:它們不支持併發播放。 (您可以通過停止給定的播放並將位置移回到第0幀然後播放來「重新觸發」。)
剪輯有多長時間?其中100個可能是很多記憶。如果每個都是第二長100秒* 44100幀每秒* 4個字節每幀= 17,640,000字節(幾乎18MB專門用於RAM的聲音!)。
我想,如果你知道一次只需要幾個,你就可以預測哪些是需要的,你可以預先加載並重用它們。但不要陷入思考片段是否意味着在播放時加載的陷阱。如果你這樣做,你應該使用SourceDataLines來代替。他們開始回放速度更快,因爲他們不必等到整個外部文件被存入內存中(如剪輯所做的那樣)。如果您打算將其重置爲第0幀並重播(或循環播放),我建議只使用剪輯!
3)一旦它作爲一個剪輯加載,它基本上已經準備好了,真的沒有一個額外的階段。在外部文件和內存中的Clip之間確實沒有任何中間階段,我可以想到這可能會有所幫助。
啊,另一個想法:你可能想要創建一個線程池(=最大併發聲音數)並管理它。我不知道在什麼時候縮放證明額外的管理。
4)可以在許多上下文中運行併發的SourceDataLines,這樣可以減少將整個文件保存在RAM中的需要。在這種情況下,我想可以預先加載的唯一東西就是文件位置的字符串。我可能是錯的,你也可以預先加載文件,但也可能不會。絕對不能重複使用AudioInputLine!另一方面,與UNLOADED Clip相比,SDL的啓動非常快。
不過!有些系統(例如某些Linux操作系統)將您限制爲單個輸出,可能是Clip或SourceDataLine。當我決定製造我自己的調音臺時,這對我來說確實很重要。我認爲如果一次只播放8或10個音調,只要圖形不太雄心勃勃(不包括上面提到的Linux操作系統情況),你可能會好起來的。你必須測試它。
我不知道你在考慮什麼替代語言。 C的一些味道是我所知道的唯一選擇。除Java之外,我所知道的其他所有東西都不是低級或足夠快,無法處理那麼多音頻處理。但我只有適度的經驗,並且沒有良好的工程背景,但是自學成才。
*「請給出答案1至4」*請考慮詢問4個問題(4個獨立的線索)。 –
*「Java可以處理多少個音頻剪輯?」*我的經驗表明,沒有硬性規定 - 這取決於JRE。 –