从黑白(和灰色)alpha 信息视频图像向视频添加透明度
Adding transparency to a video from black and white (and gray) alpha information video images
我想在 android 中创建一个透明(和半透明)的视频。源视频的图像被拆分成两张图片,上面一张有颜色信息(看起来像正常的视频图像),下面一张有alpha信息(形状相同但只有黑白和灰色,黑色表示透明) .
这是 iOS 的解决方案:
https://medium.com/@quentinfasquel/ios-transparent-video-with-coreimage-52cfb2544d54
在 android 中最好的方法是什么?
可以用javacv、FFmpegFrameGrabber、FFmpegFrameFilter等解决吗?
或者使用 OpenGL ES 和着色器更好?
有样品吗?
谢谢!
我们在 android 应用中使用完全相同的方法为视频添加透明度。我们将 OpenGL ES 与着色器一起使用,它可以完美地工作。
您需要做的只是将这些视频渲染到表面纹理(可以使用 ExoPlayer 轻松完成),然后可以从 OpenGL 将其作为常规纹理访问。对于着色器,你可以从这样的事情开始
private static final String VERTEX_SHADER = "attribute vec4 position;\n" +
"attribute vec4 inputTextureCoordinate;\n" +
" \n" +
"varying vec2 textureCoordinate;\n" +
"varying vec2 textureCoordinate2;\n" +
" \n" +
"void main()\n" +
"{\n" +
" gl_Position = position;\n" +
" textureCoordinate.x = inputTextureCoordinate.x;\n" +
" textureCoordinate.y = inputTextureCoordinate.y * 0.5;\n" +
" textureCoordinate2.x = inputTextureCoordinate.x;\n" +
" textureCoordinate2.y = inputTextureCoordinate.y * 0.5 + 0.5;\n" +
"}";
public static final String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"+
"varying highp vec2 textureCoordinate;\n"+
"varying highp vec2 textureCoordinate2;\n"+
"uniform samplerExternalOES inputImageTexture;\n" +
"void main() {\n"+
" lowp vec4 rgbcolor = texture2D(inputImageTexture, textureCoordinate);\n"+
" lowp vec4 alphaValue = texture2D(inputImageTexture, textureCoordinate2);\n"+
" gl_FragColor.a = alphaValue.g;\n"+
" gl_FragColor.rgb = rgbcolor.rgb * alphaValue.g;\n" +
"}";
并且不要忘记将其渲染到 TextureView 中并使用 TextureView.setOpaque(false);
启用透明度
我想在 android 中创建一个透明(和半透明)的视频。源视频的图像被拆分成两张图片,上面一张有颜色信息(看起来像正常的视频图像),下面一张有alpha信息(形状相同但只有黑白和灰色,黑色表示透明) .
这是 iOS 的解决方案: https://medium.com/@quentinfasquel/ios-transparent-video-with-coreimage-52cfb2544d54
在 android 中最好的方法是什么?
可以用javacv、FFmpegFrameGrabber、FFmpegFrameFilter等解决吗?
或者使用 OpenGL ES 和着色器更好?
有样品吗?
谢谢!
我们在 android 应用中使用完全相同的方法为视频添加透明度。我们将 OpenGL ES 与着色器一起使用,它可以完美地工作。 您需要做的只是将这些视频渲染到表面纹理(可以使用 ExoPlayer 轻松完成),然后可以从 OpenGL 将其作为常规纹理访问。对于着色器,你可以从这样的事情开始
private static final String VERTEX_SHADER = "attribute vec4 position;\n" +
"attribute vec4 inputTextureCoordinate;\n" +
" \n" +
"varying vec2 textureCoordinate;\n" +
"varying vec2 textureCoordinate2;\n" +
" \n" +
"void main()\n" +
"{\n" +
" gl_Position = position;\n" +
" textureCoordinate.x = inputTextureCoordinate.x;\n" +
" textureCoordinate.y = inputTextureCoordinate.y * 0.5;\n" +
" textureCoordinate2.x = inputTextureCoordinate.x;\n" +
" textureCoordinate2.y = inputTextureCoordinate.y * 0.5 + 0.5;\n" +
"}";
public static final String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"+
"varying highp vec2 textureCoordinate;\n"+
"varying highp vec2 textureCoordinate2;\n"+
"uniform samplerExternalOES inputImageTexture;\n" +
"void main() {\n"+
" lowp vec4 rgbcolor = texture2D(inputImageTexture, textureCoordinate);\n"+
" lowp vec4 alphaValue = texture2D(inputImageTexture, textureCoordinate2);\n"+
" gl_FragColor.a = alphaValue.g;\n"+
" gl_FragColor.rgb = rgbcolor.rgb * alphaValue.g;\n" +
"}";
并且不要忘记将其渲染到 TextureView 中并使用 TextureView.setOpaque(false);