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

问题描述 投票:2回答:2

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

android audiotrack
2个回答
2
投票

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

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

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


0
投票

你应该在写()之后调用play()。你的代码就像垃圾一样。

© www.soinside.com 2019 - 2024. All rights reserved.