我是android新手。
有人可以帮我使用(不建议使用的代码)来产生F频率和S秒持续时间的音调
我找到了this,但是它使用了不赞成使用的方法。
最佳答案
这是链接的代码的再现,适用于API级别23+,并添加了音频持续时间参数:
short generatedSnd[];
int sampleRate = 44100;
float freqOfTone = 1000; //Hz
float amplitude = 10000; //0..32767 (0x7FFF)
float lengthSeconds = 1.0f;
private void genTone(){
int numSamples = (int) (sampleRate * lengthSeconds);
generatedSnd = new short[numSamples];
// fill out the array
for (int i = 0; i < numSamples; ++i) {
generatedSnd[i] = (short) (Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone)) * amplitude);
}
}
private void playSound(){
AudioTrack audioTrack = new AudioTrack.Builder()
.setAudioFormat(
new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(sampleRate)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.build()
)
.setTransferMode(AudioTrack.MODE_STATIC)
.setBufferSizeInBytes(generatedSnd.length * 2) //2 bytes-per-sample
.build();
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
该代码已经在仿真器中经过了长达50s的测试,但是由于传递给
setBufferSize()
的大小,它可能会在更高的播放时间崩溃。请注意,它不包含其他高级功能来帮助您处理任意长的播放时间,例如1.)流式播放或2.)由于float
量化错误而导致的相位校正,该错误的值远非0。但是,它应该可以在少于约10秒的时间内正常工作。
还省略了AudioTrack清理代码(
stop()
/ release()
)。
关于android - 如何在固定的时间内产生特定频率的音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137625/