Android AudioTrack缓冲问题

Android AudioTrack缓冲问题,第1张

Android AudioTrack缓冲问题

我找到原因了!

问题是AudioTrack缓冲区的大小。如果无法足够快地生成样本,样本将用完,回放会暂停,然后在再次有足够的样本时继续播放。

唯一的解决方案是确保可以足够快的速度生成样本(44100 / s)。作为快速解决方案,请尝试将采样率降低到22000(或增加缓冲区的大小)。

至少这对我来说是这样的-当我优化样本生成例程时,跳跃消失了。

(增加缓冲区的大小会使声音稍后开始播放,因为有一些储备正在等待-直到缓冲区填满。但是仍然,如果您没有足够快地生成样本,最终样本会用完)。

哦,您应该将不变变量放在循环之外!并可能使样本数组更大,以便循环运行更长的时间。

short samples[] = new short[4*1024];...frequency = (float)Main.this.slider.getProgress();increment = (float)(2 * Math.PI) * frequency / 44100;for(int i = 0; i < samples.length; i++){   samples[i] = (short)((float)Math.sin(angle) * Short.MAX_VALUE);   angle += increment;}

您还可以以10Hz为步长,对200Hz-8000Hz频率的所有正弦值进行预计算。或者按需执行此 *** 作:当用户选择频率时,请使用您的方法生成样本一段时间,然后将其保存到数组中。当您生成足够的采样以产生一个完整的正弦波时,您可以继续在数组上循环(因为sin是周期函数)。实际上,由于您从未完全碰到一个周期,所以声音中可能会存在一些小的不一致之处(因为您将角度增加1,并且一个完整的正弦波的长度是sampleRate / (double)frequency采样)。但是,选择正确的时间段倍数会使不一致现象不明显。

另外,请参见http://developer.android.com/guide/practices/design/performance.html



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5083354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存