Android 在相机框架上应用效果

Posted

技术标签:

【中文标题】Android 在相机框架上应用效果【英文标题】:Android Apply Effect on Camera frame 【发布时间】:2014-01-16 11:04:15 【问题描述】:

android 17 开始,它提供了 android.media.effect 包,用于处理具有多种效果的图像。并且使用官方示例“HelloEffect”,它仅适用于图像。

现在我想为 Android 相机预览帧应用效果,我使用 SurfaceTextureGL_TEXTURE_EXTERNAL_OES 纹理从相机渲染帧。

但问题是如何在这个特殊纹理上应用效果:GL_TEXTURE_EXTERNAL_OES,它显示错误,似乎无法从这个特殊纹理中采样。

错误:

01-06 15:46:35.425: D/libEGL(14021): 加载 /vendor/lib/egl/libEGL_adreno.so 01-06 15:46:35.435: D/libEGL(14021): 加载 /vendor/lib/egl/libGLESv1_CM_adreno.so 01-06 15:46:35.435: D/libEGL(14021): 加载 /vendor/lib/egl/libGLESv2_adreno.so 01-06 15:46:35.435: I/Adreno-EGL(14021): : EGL 1.4 高通构建: _msm8974_refs/tags/AU_LINUX_ANDROID_JB_3.1.2.04.02.02.125.032_CL3849330_release_AU (CL3849330) 01-06 15:46:35.435:I/Adreno-EGL(14021):OpenGL ES 着色器编译器版本:17.01.10.SPL 01-06 15:46:35.435:I/Adreno-EGL(14021):构建日期:2013 年 10 月 21 日星期一 01-06 15:46:35.435:I/Adreno-EGL(14021):本地分支:jb_3.1.2 01-06 15:46:35.435:I/Adreno-EGL(14021):远程分支:quic/4da73f3b691eea7a9356efff8d609916f1975107 01-06 15:46:35.435:I/Adreno-EGL(14021):本地补丁:无 01-06 15:46:35.435:I/Adreno-EGL(14021):重建分支:无 01-06 15:46:35.565:D/OpenGLRenderer(14021):启用调试模式 0 01-06 15:46:36.295: W/Adreno-ES20(14021): : GL_INVALID_OPERATION 01-06 15:46:36.295:E/MCA(14021):GL 错误:“绑定纹理”操作导致 GL 错误 (0x502) 01-06 15:46:36.295: E/MCA(14021): BindInputTextures 失败 01-06 15:46:36.295: E/MCA(14021): 无法渲染帧 01-06 15:46:36.295: E/MCA(14021): ShaderProgram: 错误处理着色器! 01-06 15:46:36.305: W/dalvikvm(14021): threadid=11: 线程以未捕获的异常退出 (group=0x419fd898) 01-06 15:46:36.345:E/AndroidRuntime(14021):致命异常:GLThread 97443 01-06 15:46:36.345: E/AndroidRuntime(14021): java.lang.RuntimeException: 执行 ShaderProgram 时出错! 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.filterfw.core.ShaderProgram.process(ShaderProgram.java:123) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.filterfw.core.Program.process(Program.java:32) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.filterpacks.imageproc.LomoishFilter.process(LomoishFilter.java:200) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.filterfw.core.Filter.performProcess(Filter.java:474) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.filterfw.core.FilterFunction.execute(FilterFunction.java:80) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.filterfw.core.FilterFunction.executeWithArgList(FilterFunction.java:97) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.media.effect.SingleFilterEffect.apply(SingleFilterEffect.java:76) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 com.csz.camerafilters.activity.render.SurfaceRenderer.applyEffect(SurfaceRenderer.java:73) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 com.csz.camerafilters.activity.render.SurfaceRenderer.onDrawFrame(SurfaceRenderer.java:63) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1531) 01-06 15:46:36.345: E/AndroidRuntime(14021): 在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)

【问题讨论】:

你能粘贴错误吗? @CarlosRobles 嗨,谢谢,请检查我的日志 【参考方案1】:

我能够使用适用于 Android 的 OpenCV SDK 对相机帧应用效果。他们有一个现成的样本来证明这一点。

【讨论】:

我没有使用OpenCV,openCV有两个问题:1)当前版本2.4.7不支持Galaxy S4或Note3,2)如果我使用OpenCV,建议调用opencv intent在我的应用程序中,如果未安装 opencv,它将指导用户安装 opencv 库。【参考方案2】:

Android 效果绑定纹理为GL_TEXTURE2D,但你的纹理是GL_TEXTURE_EXTERNAL_OES,这就是原因。生成GL_TEXTURE2D的另一个纹理,在上面画相机框,一直使用这个纹理。试试吧,这只是一个理论(基于我的 OpenGL 知识)。

【讨论】:

GL_TEXTURE_2D 不是流式纹理目标,您将无法使用它进行实时流式传输(例如,来自相机)。 我知道,每帧画出从GL_TEXTURE_EXTERNAL_OESGL_TEXTURE2D 的所有内容。【参考方案3】:

是的,在大多数设备中,您需要在着色器中启用 GL_OES_EGL_image_external 扩展。查看 sgxperf 代码中的 pszFragEGLImageShader 字符串 https://github.com/prabindh/sgxperf/blob/master/sgxperf_gles20_vg.cpp

另请参阅Android OpenGL combination of SurfaceTexture (external image) and ordinary texture

【讨论】:

谢谢,但是如何启用呢?我使用的是 Java OpenGL ES2.0,而不是原生的。 使用 GLSL,用不同的方法渲染 GL_TEXTURE2DGL_TEXTURE_EXTERNAL_OES,启用 GL_OES_EGL_image_external 没有任何效果。 (如果您坚持,只需添加#extension GL_OES_EGL_image_external​ : require

以上是关于Android 在相机框架上应用效果的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上构建圆框相机

用于相机的具有透明度的矩形框架

如何设置 Open GLES2.0 与 Android 相机配合使用?

Android中的自定义相机过滤器

Android -- 相机调用摄像头拍照 & 选择照片

Android 调起系统相机拍照