如何使用Camera2 API在预览之前的几秒钟内缓冲和延迟视频

时间:2019-01-04 00:52:14

标签: java android android-camera2

我有一个工作代码,可将视频预览到简单的textureView。现在,我想缓冲几秒钟的视频(数百帧),然后将它们显示在textureView上。

我不希望进行任何转换,我只想从摄影机中获取YUV_422_888帧,将其放在较大的缓冲区中,然后在给定时间(例如10秒)后开始以记录时的相同FPS显示它们,例如30 FPS。我想继续做。

我可以找到几个将ImageReader与RenderScript或OpenGL一起使用来操纵帧的示例和想法,其中包含许多用于在不同格式之间转换的代码。有没有人建议如何在没有大量转换代码的情况下以简单的方式执行此操作?

1 个答案:

答案 0 :(得分:1)

数百帧占用大量内存。在720p时,每个YUV帧大约需要1.3 MB;在1080p时,每个占用3 MB。

因此10秒的缓冲将在720p时消耗390 MB,在1080p时消耗900 MB。这可能会在内存量较小的设备上给您带来麻烦。

您可能会使用ImageReader和ImageWriter对,尽管选择正确的格式很麻烦。 YUV_420_888可以工作,但从技术上讲,不能保证TextureView可以接受它们(但可以在许多(可能是所有)设备上使用)。因此,如果有YV12,那可能是更好的选择。

然后使用该格式创建一个ImageReader和ImageWriter;对于ImageWriter,从TextureView给它一个Surface。对于ImageReader,请将其Surface传递到相机设备。

然后,当从ImageReader获得新图像时,获取它并将其内容(来自所有3个平面)复制到循环缓冲区中。一旦缓冲区已满,就开始将帧从缓冲区复制到ImageWriter。

理论上,您可以在ImageReader本身中缓冲帧而无需副本,但是它最多可以在队列中排队约64帧。距离10秒还远远不够。