- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从 Android api 级别 1 开始,我们可以使用 setDisplay 或 setPrewviewDisplay 将 MediaPlayer 或 Camera 附加到 Surface,然后图像数据可以传输到 gpu 并更快地处理。
引入 SurfaceTexture 后,我们可以使用目标 GL_TEXTURE_EXTERNAL_OES 创建自己的纹理,并将 MediaPlayer 或 Camera 附加到 opengl es。
这些都是众所周知的,但我想说的是底层的Android图形架构。( Android Graphics architecture )
产生的数据是在CPU端,所以必须以非常快的方式传输到GPU。
为什么每台 Android 设备传输数据的速度都如此之快,以及如何在底层传输数据?
或者这是与 Android 无关的硬件问题?
最佳答案
数据不是在CPU端产生的。相机和硬件视频编解码器将它们的数据存储在由内核 gralloc 机制分配的缓冲区中(通过非公共(public) GraphicBuffer 从 native 代码引用)。 Surfaces 通过 BufferQueue 对象进行通信,该对象通过句柄传递帧,而不复制数据本身。
由 OEM 确保相机、视频编解码器和 GPU 可以使用通用格式。视频编解码器输出的 YUV 必须是 GLES 实现可以作为外部纹理处理的东西。这也是为什么在将 GLES 渲染发送到 MediaCodec 时需要 EGL_RECORDABLE_ANDROID
的原因...需要让 EGL 实现知道它正在渲染的帧必须可以被视频编解码器识别。
关于android - 如何理解 setDisplay/setSurface/setPrewviewDisplay/setPreviewTexture for Android 的底层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35236964/
从 Android api 级别 1 开始,我们可以使用 setDisplay 或 setPrewviewDisplay 将 MediaPlayer 或 Camera 附加到 Surface,然后图像
我是一名优秀的程序员,十分优秀!