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

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

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

最佳答案

数百帧占用大量内存。在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秒还远远不够。

关于java - 如何使用Camera2 API在预览之前的几秒钟内缓冲和延迟视频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54031829/

10-09 01:36
查看更多