Android audiotrack getMinBufferSize() 在不同的设备上返回不同的值
Android audiotrack getMinBufferSize() returning different values on different devices
我有一个音频合成应用程序,它使用缓冲区大小和搜索栏值来改变速度。缓冲区大小越小,速度越快。从缓冲区大小中减去 seekbar 值;搜索栏移动得越远,速度越快。
Buffersize 的计算方法是:
int buffersize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
在三星 Galaxy S6 手机上,返回的缓冲区大小为 10584。滑块值的底部和顶部分别为 60 bpm 和 192 bpm。
但是,在 7" LG G Pad 7.0 上,返回的缓冲区大小仅为 3528。因此,起始速度约为 180-200 bpm,而不是所需的 60 bpm。
我曾考虑使用基于屏幕大小的硬编码缓冲区大小,但这只是创可贴的工作。
为什么相同的计算会在两个设备上返回两个不同的缓冲区大小?缓冲区大小是如何计算的?
已知缓冲区大小因设备而异。它针对不同的底层硬件进行了优化。这就是为什么有一种方法来计算这个值,而不是一些关于如何自己计算它的说明。
AudioTrack 缓冲区大小与速度无关。它只是 AudioTrack 必须分配的最小字节数才能有效运行。您发送到 AudioTrack 的字节可以包含您想要播放的任何内容,只要它符合您用于创建 AudioTrack 的规范。
另外,请注意,它甚至可以(很少)在同一设备上有所不同。我在 Nexus 5X 上看到过一次,不知道什么原因,就这一次,最小缓冲区大小是通常方法的两倍 returns.
我有一个音频合成应用程序,它使用缓冲区大小和搜索栏值来改变速度。缓冲区大小越小,速度越快。从缓冲区大小中减去 seekbar 值;搜索栏移动得越远,速度越快。
Buffersize 的计算方法是:
int buffersize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
在三星 Galaxy S6 手机上,返回的缓冲区大小为 10584。滑块值的底部和顶部分别为 60 bpm 和 192 bpm。
但是,在 7" LG G Pad 7.0 上,返回的缓冲区大小仅为 3528。因此,起始速度约为 180-200 bpm,而不是所需的 60 bpm。
我曾考虑使用基于屏幕大小的硬编码缓冲区大小,但这只是创可贴的工作。
为什么相同的计算会在两个设备上返回两个不同的缓冲区大小?缓冲区大小是如何计算的?
已知缓冲区大小因设备而异。它针对不同的底层硬件进行了优化。这就是为什么有一种方法来计算这个值,而不是一些关于如何自己计算它的说明。
AudioTrack 缓冲区大小与速度无关。它只是 AudioTrack 必须分配的最小字节数才能有效运行。您发送到 AudioTrack 的字节可以包含您想要播放的任何内容,只要它符合您用于创建 AudioTrack 的规范。
另外,请注意,它甚至可以(很少)在同一设备上有所不同。我在 Nexus 5X 上看到过一次,不知道什么原因,就这一次,最小缓冲区大小是通常方法的两倍 returns.