android java AudioTrack缓冲区大小没有意义

时间:2018-06-08 10:55:26

标签: java android audio audiotrack

我想让手机变得简单"嘟嘟"噪声。

我已遵循示例here

我可以发出哔哔声并改变音调和长度。

AudioTrack.getMinBufferSize()建议最小缓冲区大小为1280。

但是使用那个值我并没有得到所有的哔哔声(它比应该的更短)。 这些数字均为(请求)1秒钟的哔哔声。

我将缓冲区大小从2个字节改为16000个字节。

在2到1280个字节之间,我合理地持续了940毫秒。

从1280到15998字节,蜂鸣声变短了。

最短的实际上是大约12000,250毫秒。

然后它在15998再次增加到337毫秒。 在16000时,根本没有发出哔哔声。

所以,我从来没有完整的1000毫秒,最长的是大约950毫秒。

最短的时间约为250毫秒。

没有其他任何改变,只是缓冲区大小。

使用Sonic Visualiser我可以录制哔哔声并在我的电脑上看到波形。这就是我测量蜂鸣声持续时间的方式。

由于我一直在使用的振幅斜坡和斜坡输出,我可以清楚地看到蜂鸣声从0开始正确地开始,并且它们在末尾被截断。我失去了哔哔声的结束。

任何人都可以解释这个并告诉我如何获得我的所有1秒钟的哔声吗?

更多信息:

对于1秒以外的蜂鸣声持续时间,会发生相同的截断。

麦克风和PC未经校准,但结果可重复。

代码的主要部分如下:

int minBufferSize = AudioTrack.getMinBufferSize(mSampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

mAudioTrack = new AudioTrack(AudioManager.STREAM_ALARM,
                mSampleRate,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                mBufferSize,
                AudioTrack.MODE_STREAM);

来自Sonic Analyzer的图片。

所有这些测试均使用Galaxy S4 Running 5.0.1

完成

如何获得完整的1秒钟哔声?

此单张图片可以更好地解释问题: shows: expected profile, profile for buffer=2, profile for buffer=12000

这是缓冲区大小与蜂鸣声长度的关系图。 始终生成相同的蜂鸣声数据,唯一改变的是缓冲区大小:variation of "beep" length with buffer size

0 个答案:

没有答案