【问题标题】:Android: Audiotrack to play sine wave generates buzzing noiseAndroid:播放正弦波的音轨会产生嗡嗡声
【发布时间】:2014-04-19 19:03:32
【问题描述】:

在过去的几个小时里,我一直在努力让这段小代码工作。它旨在成为一个最小的 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 位编码,我根本听不到声音。

【问题讨论】:

  • 嗨 loadstar,我想做相反的功能,想录制音频并同时绘制其正弦波,有什么帮助吗??

标签: android audiotrack


【解决方案1】:

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

将左右声道的音量调至最大值(1.0f 或使用 getMaxVolume()),而不是 0.1f(幅度非常小)。

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

【讨论】:

    【解决方案2】:

    你应该在 write() 之后调用 play()。你现在的代码会很垃圾。

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 2021-11-28
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多