मैं एंड्रॉइड में पारदर्शिता (और अर्ध पारदर्शिता) के साथ एक वीडियो बनाना चाहता हूं। स्रोत वीडियो की छवियों को दो छवियों में विभाजित किया गया है, शीर्ष एक रंग जानकारी के साथ (सामान्य वीडियो छवि की तरह दिखता है), नीचे वाला एक अल्फा जानकारी के साथ (समान आकार लेकिन केवल काले और सफेद और भूरे रंग में, काला का अर्थ है पारदर्शी) .

आईओएस के लिए यह समाधान है: https://medium.com/@quentinfasquel/ios-transparent- video-with-coreimage-52cfb2544d54

एंड्रॉइड में इसका सबसे अच्छा तरीका क्या होगा?

क्या इसे javacv, FFmpegFrameGrabber, FFmpegFrameFilter आदि से हल किया जा सकता है?

या ओपनजीएल ईएस और शेडर्स के साथ बेहतर?

क्या कोई नमूने हैं?

धन्यवाद!

2
Jan F. 27 जून 2018, 18:45

1 उत्तर

सबसे बढ़िया उत्तर

हम अपने एंड्रॉइड ऐप में वीडियो में पारदर्शिता जोड़ने के लिए बिल्कुल उसी दृष्टिकोण का उपयोग करते हैं। हम ओपनजीएल ईएस का उपयोग शेडर्स के साथ करते हैं और यह त्रुटिपूर्ण रूप से काम करता है। आपको बस उन वीडियो को सतह की बनावट में प्रस्तुत करना है (एक्सोप्लेयर का उपयोग करके आसानी से किया जा सकता है) और बाद में इसे ओपनजीएल से नियमित बनावट के रूप में एक्सेस किया जा सकता है। शेडर के लिए आप कुछ इस तरह से शुरू कर सकते हैं

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.setOpaque(false); के साथ पारदर्शिता सक्षम करें

2
jfawkes 3 जुलाई 2018, 16:35