2013-02-12 142 views
2

我試圖產生5秒正弦波的聲音的頻率1000 我已經寫以下代碼持續時間的生成的音頻正弦波的

int sampleRate = 44100; 
int freqOfTone = 1000; 
AudioTrack track; 
// 5 seconds 
short samples = new short[sampleRate*5]; 
track = new AudioTrack(AudioManager.STREAM_MUSIC, 
     sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
             AudioFormat.ENCODING_PCM_16BIT, samples.length, 
             AudioTrack.MODE_STATIC); 

double angle = 0; 
double increment = (2 * Math.PI * freqOfTone/sampleRate); // angular increment 

for (int i = 0; i < samples.length-1; i++) { 
      samples[i] = (short) (Math.sin(angle) * Short.MAX_VALUE); 
      angle += increment; 
    } 
track.write(samples, 0, samples.length); // write data to audio hardware 
track.play(); 

聲波長度只有2.5秒,我想它應該是5秒鐘。爲什麼?

回答

0

track.play();同步還是異步?如果是後者,您可能會在程序結束前關閉程序。您可以嘗試「按任意鍵」或其他暫停,以確認。

+0

我正在使用靜態模式而不是流模式。此外,我嘗試了一個按鈕,我仍然有同樣的問題。如果我把樣品10 * sampleRate,我得到5秒。所以它總是除以2. – yasserbn 2013-02-12 22:31:30

0

這似乎是正確的行爲,因爲您指定了ENCODING_PCM_16BIT,如果將其更改爲ENCODING_PCM_8BIT,您將獲得5秒的遊戲時間。

+0

但我將樣本存儲在16位寄存器(短)而不是8位(字節)。無論如何,我需要繼續Encoding_PCM_16BIT,我怎麼能5秒? – yasserbn 2013-02-13 09:33:31

+0

你已經知道答案,將'sampleRate'乘以10而不是5 – iTech 2013-02-13 09:35:59

+0

這就是問題所在;我爲什麼要乘以2.另外,當我這樣做時(sampleRate * 10),聲音的頻率將是2000hz而不是1000hz。我需要它與1000hz 5秒。 – yasserbn 2013-02-13 12:25:28

3

請參閱參考資料。

AudioTrack構造函數的第5個參數是「bufferSizeInBytes」。

+1

這是答案,將第五個參數從'samples.length'改爲'samples.length * Short.SIZE/Byte.Size'。 – 2013-02-17 13:07:33