Android:Audiotrack播放正弦波会产生嗡嗡声

时间:2014-04-19 19:03:33

标签: android audiotrack

我一直试图让这段小代码在过去几小时内正常运行。它是一个最小化的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位编码,我根本就没有声音。

2 个答案:

答案 0 :(得分:2)

坚持使用ENCODING_PCM_16BIT而不是ENCODING_PCM_8BIT(如文档中所述,设备不保证它不受支持)。

在左右声道调节音量最大(1.0f或使用getMaxVolume()),而不是0.1f(实际上是低振幅)。

将缓冲区从4410(播放时间仅为100毫秒)增加到2 * 44100(应该代表2秒播放)。

答案 1 :(得分:0)

您应该在write()之后调用play()。照原样,您的代码会产生垃圾。