2013-02-12 101 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