1

由于 Android api level 1,我们可以使用 setDisplay 或 setPrewviewDisplay 将 MediaPlayer 或 Camera 附加到 Surface,然后图像数据可以传输到 gpu 并更快地处理。

引入 SurfaceTexture 后,我们可以使用目标 GL_TEXTURE_EXTERNAL_OES 创建自己的纹理,并将 MediaPlayer 或 Camera 附加到 opengl es。

这些都是众所周知的,但是我要说的是下面是关于Android图形架构的。(Android图形架构

生成的数据在 CPU 端,因此必须以非常快速的方式将其传输到 GPU。

为什么每台 Android 设备的数据传输速度都如此之快,以及如何将其置于底层?

或者这是一个与Android无关的硬件问题?

4

1 回答 1

2

数据不是在 CPU 端产生的。相机和硬件视频编解码器将它们的数据存储在由内核 gralloc 机制分配的缓冲区中(通过非公共 GraphicBuffer 从本机代码引用)。Surfaces 通过 BufferQueue 对象进行通信,这些对象通过句柄传递帧,而不复制数据本身。

由 OEM 来确保相机、视频编解码器和 GPU 可以使用通用格式。视频编解码器输出的 YUV 必须是 GLES 实现可以作为外部纹理处理的东西。这也是为什么EGL_RECORDABLE_ANDROID在将 GLES 渲染发送到 MediaCodec 时需要...需要让 EGL 实现知道它渲染的帧必须可以被视频编解码器识别。

于 2016-02-24T06:41:23.697 回答