0

我正在使用Camera2 API在C的本机端连续拍照,它工作正常,除了有时在receivenf onImageAvailable回调之后,调用acquireLatestImage时,返回NO_BUFFER_AVAILABLE。根据 Android 文档:https ://developer.android.com/ndk/reference/struct/a-image-reader-image-listener#onimageavailable

请注意,调用 AImageReader_acquireNextImage 或 AImageReader_acquireLatestImage 可能会在此回调中返回 AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE。例如,当有多个图像和回调排队时,如果应用程序调用 AImageReader_acquireLatestImage,一些图像将在其相应的回调执行之前返回给系统

有人可以解释一下这实际上何时会发生以及可能的解决方案。

4

1 回答 1

0

如果您已经将多个图像捕获到 中AImageReader,则调用AImageReader_acquireLatestImage将丢弃所有图像,但最新的除外,然后返回最新的图像。

所以你得到一个这样的序列:

onImageAvailable()
onImageAvailable()
onImageAvailable()
acquireLatestImage() -> OK
acquireLatestImage() -> NO_BUFFER_AVAILABLE
acquireLatestImage() -> NO_BUFFER_AVAILABLE
onImageAvailable()
acquireLatestImage() -> OK

第二次调用acquireLatestImage()将获得 NO_BUFFER_AVAILABLE,因为前一次调用丢弃了所有其他缓冲区,并且在第二次调用之前没有新图像到达。

如果您想始终查看所有图像缓冲区,请使用acquireNextImage(),它不会丢弃较旧的缓冲区,而只会返回队列中的下一个缓冲区。

onImageAvailable()
onImageAvailable()
onImageAvailable()
acquireNextImage() -> OK
acquireNextImage() -> OK
acquireNextImage() -> OK
acquireNextImage() -> NO_BUFFER_AVAILABLE
onImageAvailable()
acquireNextImage() -> OK
于 2021-10-28T14:17:21.400 回答