从移动设备为CPU和GPU共享内存的事实中获利的唯一方法就是使用GrphicBuffer
。但由于Android 7限制访问私有本机库(包括gralloc),因此无法再使用它。问题是 - 有没有其他方法可以直接访问纹理的像素数据?
我知道,可以使用PBO(像素缓冲对象)完成类似的事情。但它仍然会进行额外的内存复制,这是不可取的。特别是如果我们知道的话,有办法用零拷贝来做。
有许多应用程序使用此功能,因为它可以大大提高性能。我想现在很多开发人员都遇到了这个问题。
答案 0 :(得分:0)
我认为您可以使用SurfaceTexture,SurfaceTexture可以由MediaCore创建,SurfaceTexture可以由MediaCore直接编码。该计划可以在每个视频帧2ms-5ms中处理1080p视频。
答案 1 :(得分:0)
自Android 8 / API 26起(抱歉,Android 7 ...不适用)
Hardware Buffer APIs是GrphicBuffer()
的替代项。
本机硬件缓冲区API可让您 直接分配缓冲区以创建自己的管道 跨进程缓冲区管理。您可以分配AHardwareBuffer 并通过它来获取EGLClientBuffer资源类型 eglGetNativeClientBufferANDROID扩展。
NDK的最低版本为15c(2017年7月)
Android NDK,修订版15c(2017年7月)
添加了适用于Android 8.0的本机API。
*硬件缓冲区API
android/hardware_buffer_jni.h
在目录(NDK)/sysroot/usr/include/
参考:
NDK-Native Hardware Buffer(android / hardware_buffer_jni.h)
Android / Java-HardwareBuffer
GrphicBuffer相关文章Using OpenGL ES to Accelerate Apps with Legacy 2D GUIs
NB:适用于Android 7 / API 24
本机API指南还在Graphics/EGL section
API级别24添加了对EGL_KHR_mutable_render_buffer的支持, ANDROID_create_native_client_buffer,以及 ANDROID_front_buffer_auto_refresh扩展。
和EGL_ANDROID_create_native_client_buffer是包含eglCreateNativeClientBufferANDROID()
的EGL扩展名,它返回EGLClientBuffer
。 (EGL / eglext.h)