2017-03-01 84 views
-3

我需要在Java中創建一個函數,該函數爲音頻添加特定頻率和長度的音符。我的頻率爲雙倍,音符長度以毫秒爲單位。如何從幀的長度(以毫秒爲單位)查找音符的幀長,字節和整數

全功能描述:

This method takes one AudioInputStream and adds the sound of a certain pure frequency to the FRONT of it, lasting a certain length of time. So the method takes two additional parameters: frequency and noteLengthInMilliseconds. The amplitude of the additional sound should be 64*256.

不過,我需要找到音符在幀的長度,以及在字節數和整數。

此外,關於如何創建筆記作爲樣本數據數組(使用java.sound.sampled包)的任何建議將會有所幫助。

FRAME &採樣率:44100.0hz
編碼:PCM_SIGNED

+0

什麼樣的框架? PCM幀?採樣率是多少?而且,「以及字節和Ints」是什麼意思? – Brad

+0

PCM_SIGNED編碼,44,100.0赫茲採樣率 – Markeazy

回答

1

由於您的幀速率和採樣率是相同的,我們假設你指的是PCM幀。 PCM幀是每個通道一個樣本。如果你只有一個音頻通道,每個採樣16位,你會得到每兩個字節一幀。如果您有每個採樣16位的立體聲音頻,則每四個字節會獲得一個幀。

要計算出長度,請取樣速率並將其分開。如果我有44.1 kHz的採樣率,我想記要持續1.5秒:

44,100 * 0.5 = 22,050 samples (22,050 frames) 

從那裏,如果你知道音頻是16位,而只有一個通道:

22,050 * 2 (bytes per channel) * 1 (channels) = 44,100 bytes 
+0

所以,如果我有毫秒的長度和44的採樣率。1千赫,有兩個通道,我只是簡單地做: '(44,100 * noteLengthInSeconds)* 2(字節每通道)* 2(通道)'? – Markeazy

+0

是的。不要忘記將您的毫秒轉換爲秒。 – Brad

1

幀中的長度是一個簡單的計算,它依賴於AudioFormat中的信息。具體來說,檢查屬性「frameRate」。每幀的字節數由frameSize屬性覆蓋。

使您的音頻數據數組涉及幾個步驟。純音的值可以通過運行Math.sin函數來創建。 Math.PI * 2相當於一個完整週期(我希望你已經知道這一點 - 這是非常基本的),所以使用division來計算每個步驟的增量有多小。

Math.sin函數的結果是-1和1之間的雙精度值。您必須將此數字轉換爲適合賦值的數據範圍。這是通過將音頻值乘以一個因子來完成的。例如,乘以32767將導致填充Short或16位的範圍被簽名。

從Short到Byte的轉換部分取決於您是否是big-endian或little-endian。您還必須管理是否有多個曲目(例如,立體聲是常見的)。所有這些步驟已被覆蓋在其他Stackoverflow的帖子。

一旦你有了數據陣列,它如何與現有的音頻相結合,部分取決於你是輸出音頻還是試圖創建一個新的wav文件來導出。 Java教程的Audio Trail中有一些章節涵蓋了回放,保存文件以及文件格式和格式轉換的一個很好的部分(強烈建議您閱讀本文)。

相關問題