我一直试图让这段小代码在过去几小时内正常运行。它是一个最小化的AudioTrack示例,因为我发现很多例子都很复杂。
private void playSound() {
// AudioTrack definition
int mBufferSize = AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_8BIT);
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT,
mBufferSize, AudioTrack.MODE_STREAM);
// Sine wave
double[] mSound = new double[4410];
short[] mBuffer = new short[4410];
for (int i = 0; i < mSound.length; i++) {
mSound[i] = Math.sin((2.0*Math.PI * 440.0/44100.0*(double)i));
mBuffer[i] = (short) (mSound[i]*Short.MAX_VALUE);
}
mAudioTrack.setStereoVolume(0.1f, 0.1f);
mAudioTrack.play();
mAudioTrack.write(mBuffer, 0, mSound.length);
mAudioTrack.stop();
mAudioTrack.release();
}
当我调用函数playSound()
时,我只得到一个听起来不像纯正弦波的短暂嗡嗡声。我尝试了不同的采样率,范围从8000Hz到44100Hz,以及不同的缓冲区大小。
导出mBuffer
的内容表明正确生成了正弦波。如果我用Matlab播放它也会正常播放,尽管音高太高。
我有什么不正确的事吗?此外,如果我尝试16位编码,我根本就没有声音。
答案 0 :(得分:2)
坚持使用ENCODING_PCM_16BIT而不是ENCODING_PCM_8BIT(如文档中所述,设备不保证它不受支持)。
在左右声道调节音量最大(1.0f或使用getMaxVolume()),而不是0.1f(实际上是低振幅)。
将缓冲区从4410(播放时间仅为100毫秒)增加到2 * 44100(应该代表2秒播放)。
答案 1 :(得分:0)
您应该在write()之后调用play()。照原样,您的代码会产生垃圾。