在Android上使用openSL传输原始PCM音频时,寻求有关如何处理缓冲区的知识

时间:2014-11-04 04:15:04

标签: android audio android-ndk opensl

我已经在几个地方读过,对于流式音频,你需要排队至少2个缓冲区,至少在使用SLBufferQueueItf或SLAndroidSimpleBufferQueueItf时。 使用2个缓冲区似乎是最常用的方法。正在播放一个缓冲区,而另一个缓冲区则充满了新数据。这在理论上是完全合理的。

在NDK的原生音频示例项目中,有以下评论:

  

"对于流式播放,我们通常会将至少2个缓冲区排入队列   开始"

这是否意味着在2个缓冲区入队后才开始播放?

我尝试通过连续两次调用Enqueue(....)来排队2个缓冲区,但是在我第二次排队之前会调用bufferqueue回调。

如果我需要实际排队2个缓冲区来开始播放,我可以在什么时候开始填充第三个缓冲区?第三个缓冲区应该重用我排队的第一个缓冲区。

我的SLDataLocator设置如下:

SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};

在实践中,似乎过程如下: Engueue第一缓冲区 - >当回调到来时(立即)排队第二个缓冲区    - >等待第二次回调以排入第三个缓冲区

除了在回调中将一个缓冲区加入另一个缓冲区之外,我还没有看到如何将2个缓冲区加入。另外,我正在使用设备的本机缓冲区大小。

另外,我不会想到" enqueing"是一个词。

编辑:此提交中的一些信息为4.4:https://android.googlesource.com/platform/frameworks/wilhelm/+/92e53bc98cd938e9917fb02d3e5a9be88423791d%5E!/ 我刚刚在这个有用的SO帖子中找到了它:Low-latency audio playback on Android

0 个答案:

没有答案