【问题标题】:AndroidStudio - Play a generated sound n times per secondAndroid Studio - 每秒播放 n 次生成的声音
【发布时间】:2018-01-03 10:36:01
【问题描述】:

我编写了一个使用 AudioTrack 生成短声音的应用程序。声音是使用正弦波生成的。

如果我每秒播放声音 2 或 3 次,绝对没有问题。但如果我将频率提高到 15 赫兹或更高,应用程序会立即崩溃。

我认为问题在于每次播放声音时,都会用正弦数据写入一个新的 AudioTrack 对象。但是如果我只产生一次声音,我只能播放一次。如果我再次尝试播放它,则没有任何反应。

类属性为:

private float duration;
private short[] buffer;

构造函数是:

public SoundGenerator()
{

}

public SoundGenerator(float duration)
{
    duration *= 44100;
    duration *= 2;
    this.duration = duration;
    buffer = new short[(int)this.duration];
}

下面是实际代码:

    public void generateSound(double frequency, float duration)
    {
        duration *= 44100;
        duration *= 2;

        double[] mSound = new double[(int)duration];
        for (int i = 0; i < this.buffer.length; i++)
        {
            mSound[i] = Math.sin((2.0*Math.PI * i/(44100/frequency)));
            this.buffer[i] = (short) (mSound[i]*Short.MAX_VALUE);
        }
    }

public void playGeneratedSound(float volume)
{
    AudioTrack generatedSound = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
            AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
            (int)this.duration, AudioTrack.MODE_STATIC);

    generatedSound.setStereoVolume(volume, volume);

    generatedSound.write(this.buffer,0,(int)this.duration);
    generatedSound.play();
}

【问题讨论】:

    标签: java audio playback audiotrack


    【解决方案1】:

    我通过使用不同的方法解决了这个问题:应用程序在后台运行一个线程,该线程会产生无限长的声音。在另一个线程中,将第一个线程中播放的声音的音量设置为 1.0 和指定频率的 0.0。

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多