3

如果我将一个缓冲区排入队列以记录到缓冲区队列中 - 有没有办法知道该缓冲区何时被实际填充,所以我可以使用它?

同样,有没有办法知道缓冲区何时播放?

对于上下文:我正在修改名为“native-audio”的 NDK 示例。它使用 SLAndroidSimpleBufferQueueItf 进行播放,并评论说,对于我想做的流记录,也应该使用这样的队列。现在我想知道,因为从我记得在某处读过的内容来看,不能保证在下一次录制回调调用时缓冲区已被填充(或在播放回调中播放,就此而言) - 人们怎么知道什么时候缓冲区已被使用?肯定有什么办法,否则这一切都会有点没用?^^

4

1 回答 1

4

对于录制,如果您注册 an slBufferQueueCallbackIBufferQueue_RegisterCallback您应该在缓冲区被填满时获得回调。

另请参阅android-ndk 列表上的讨论:

如果我理解得很好,每次填充队列中的缓冲区时,记录器都会回调,并且这些缓冲区按照它们入队的顺序填充。但是回调似乎没有公开指向相应填充缓冲区的指针。那么有什么方法可以找回呢?OpenSL ES 规范中的示例代码显示了一个播放示例,该示例使用作为回调上下文传入的结构来跟踪这些内容,是这样做的吗?
……
对。这是 OpenSL ES 1.0.1 规范中的一个已知缺陷。OpenSL ES 1.1 添加了显式参数来标识缓冲区,但 Android 目前基于 1.0.1 规范。一种解决方法是自己维护一个索引以指示正在完成哪个缓冲区。

于 2012-12-19T16:24:04.207 回答