2013-05-16 43 views
0

我在用Java製作遊戲。我想要有大約100個不同的樣本,並且在任何給定時間,可以播放10個樣本。但是,對於這10個樣本中的每一個,我都希望能夠操縱它們的音量和聲像。Java可以處理多少個音頻剪輯?

至於現在,我請求如下一行:新DataLine.Info(Clip.class, format);

我不指定我需要這條線的控制,但現在看來,剪輯總是有MASTER_GAIN和平衡控制。

  1. 這是正確的嗎?
  2. 我可以創建一個由100個剪輯組成的數組並預加載所有的樣本嗎?我不太明白Java的線是否與物理線路一致,或者是否是虛擬化的。
  3. 如果我有限,那麼我怎樣才能將樣品進出線?有沒有辦法做到這一點,以便我所說的100個樣本都被預加載?或者,預加載僅在您已經有指定行的情況下提供幫助?
  4. 再一次,如果我有限,這是錯誤的方法?我應該: a。使用不同的編程語言,和/或b。使用不同的編程語言和/或 b。手動合併音頻流並將它們全部通過相同的線路。

哇,這是很多問題。我沒有在文檔中找到答案,我真的希望你們能幫忙。請將您的答案編號爲1至4.非常感謝!

+1

*「請給出答案1至4」*請考慮詢問4個問題(4個獨立的線索)。 –

+0

*「Java可以處理多少個音頻剪輯?」*我的經驗表明,沒有硬性規定 - 這取決於JRE。 –

回答

1

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之外,我所知道的其他所有東西都不是低級或足夠快,無法處理那麼多音頻處理。但我只有適度的經驗,並且沒有良好的工程背景,但是自學成才。

+0

非常感謝!事情進展順利,這是相當豐富的。 :d –