通过黑白(和灰色)alpha信息视频图像为视频添加透明度

时间:2018-06-27 15:45:47

标签: android ffmpeg opengl-es javacv android-ffmpeg

我想在Android中创建具有透明性(和半透明性)的视频。源视频的图像分为两幅图像,最上面的一个带有颜色信息(看起来像普通视频图像),最下面的一个带有alpha信息(相同的形状,但只有黑白和灰色,黑色表示透明) 。

这是iOS的解决方案: https://medium.com/@quentinfasquel/ios-transparent-video-with-coreimage-52cfb2544d54

在android中实现此目的的最佳方法是什么?

这可以使用javacv,FFmpegFrameGrabber,FFmpegFrameFilter等解决吗?

或者使用OpenGL ES和着色器更好?

有样品吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我们使用完全相同的方法为我们的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);

启用透明度