gpt4 book ai didi

java - AudioTrack 没有播放完整的缓冲区

转载 作者:行者123 更新时间:2023-11-30 09:34:04 41 4
gpt4 key购买 nike

我试图以 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 缓冲区大小分离。根据我的经验,只使用最小缓冲区大小然后让大写 block 直到完成就可以很好地工作。

我注意到可能会对此产生影响的其他因素是,只有缓冲区的一半被填满后,音频才会播放。 AudioTrack 中的缓冲区可能很大,以至于它只占用了那一半并尝试处理它。

关于java - AudioTrack 没有播放完整的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11928123/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com