【问题标题】:AudioTrack not playing the full bufferAudioTrack 没有播放完整的缓冲区
【发布时间】:2012-08-13 04:13:42
【问题描述】:

我试图以 600hz 播放 10 秒的声音,但我得到 600hz 的时间不超过 3 秒。有人能指出我做错了什么吗?

    int minBuffersize = AudioTrack.getMinBufferSize(samplerate, 
           AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    int size= (int) ((10f*samplerate)
            /minBuffersize +1);

            size*=minBuffersize;//round to the nearest minBuffersize multiple so I don't get an error

    short[] play= new short[size];

    for(int i =0;i<play.length;i++){
        float time=(float)i/(float)samplerate;

        play[i]=(short) (((float)Short.MAX_VALUE/10f)*Math.sin(
                600f
                *time
                *(2f*Math.PI)));
    }

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,
            samplerate,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            play.length,
            AudioTrack.MODE_STATIC);


    int result=at.write(play,0,play.length);

    Log.d("!!!", "result: "+result);

    at.play();

调试行返回的位置

result: 221184

始终如一。

注意 play.length = 442368。

经过多次试验,缓冲区始终是 play.length 的一半,但声音本身仅持续 3-5 秒,无论缓冲区有多大。

【问题讨论】:

  • 检查 AudioTrack.write() 的返回值,确保整个缓冲区都被写入。
  • 好点,我相应地更新了问题。我仍然不确定为什么它只写了一半的缓冲区。

标签: java android audio audiotrack


【解决方案1】:

我建议将播放长度与 AudioTrack 缓冲区大小分离。以我的经验,只使用最小缓冲区大小然后让大写块直到完成。

我注意到可能会影响这一点的其他一些事情是,直到缓冲区的一半被填满,音频才会播放。 AudioTrack 中的缓冲区可能如此之大,以至于它只占用了那一半并试图通过它。

【讨论】:

    【解决方案2】:

    AudioTrack 需要缓冲区大小(以字节为单位)。由于 Short 使用 2 个字节,因此您应该使用 size * 2 作为缓冲区大小。

    【讨论】:

      【解决方案3】:

      在 AudioTrack 中,您使用 AudioTrack.MODE_STATIC(用于具有低延迟要求的短声音),而您应该使用 AudioTrack.MODE_STREAM,因为它适合用于长缓冲区(不知道确切但可能与3 秒)。

      看看here : AudioTrack

      只需将您的代码更改为:

      AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,
              samplerate,
              AudioFormat.CHANNEL_OUT_MONO,
              AudioFormat.ENCODING_PCM_16BIT,
              play.length,
              AudioTrack.MODE_STREAM);
      

      它应该可以工作。

      【讨论】:

      • 这是有道理的。 @user833970,你试过了吗?
      • 我已经很多年没有接触过这个项目了,所以我无法判断这是否解决了问题。这听起来很合理,如果有人可以确认这一点,我会标记答案正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2011-10-31
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多