Добавление прозрачности к видео из черно-белых (и серых) альфа-информационных видеоизображений - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы создать видео с прозрачностью (и полупрозрачностью) в Android. Изображения исходного видео разделены на два изображения: верхнее с информацией о цвете (выглядит как обычное видеоизображение), нижнее с альфа-информацией (те же формы, но только черно-белые и серые, черный означает прозрачный) ,

Это решение для iOS: https://medium.com/@quentinfasquel/ios-transparent-video-with-coreimage-52cfb2544d54

Каков наилучший способ сделать это в Android?

Можно ли решить эту проблему с помощью javacv, FFmpegFrameGrabber, FFmpegFrameFilter и т. Д .?

Или лучше с OpenGL ES и шейдерами?

Есть ли образцы?

Спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Мы используем точно такой же подход, чтобы добавить прозрачность к видео в нашем приложении для 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);

...