AlphaPlayer icon indicating copy to clipboard operation
AlphaPlayer copied to clipboard

原始视频左右调换后,需要修改什么参数?

Open softjapan opened this issue 3 years ago • 13 comments

原始视频左右调换后,需要修改什么参数?

softjapan avatar May 25 '21 00:05 softjapan

即:原始視頻在左側,透明通道在右側的情況,謝謝。

softjapan avatar May 25 '21 09:05 softjapan

应该是修改.metal文件,搞懂README里面那个合成原理图就很容易修改了

dourgulf avatar Jun 03 '21 01:06 dourgulf

实在不会改代码还可以改原视频,使用ffmpeg对mp4做水平翻转~。

hflip 水平翻转

ffmpeg -i input.mp4 -vf "hflip" -vframes 1 output.png -y

dourgulf avatar Jun 03 '21 01:06 dourgulf

我试了试,主要改两个地方。 1 frag.sh, 修改成从左边取色,右边取透明度

#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sTexture;

void main() {
    vec4 color = texture2D(sTexture, vTextureCoord);
    vec4 color2Map = vec4(1.0, 1.0, 1.0, 1.0);
    if (vTextureCoord.x < 0.5) {
        color2Map = texture2D(sTexture, vec2(vTextureCoord.x + 0.5, vTextureCoord.y));
        gl_FragColor = vec4(color.r, color.g, color.b, color2Map.g);
    } else {
        gl_FragColor = vec4(color.r, color.g, color.b, color.a);
    }
}

2 render的uv坐标,贴纹理的左半部分

private var halfRightVerticeData = floatArrayOf(
        // X, Y, Z, U, V
        -1.0f, -1.0f, 0f, 0f, 0f,
        1.0f, -1.0f, 0f, 0.5f, 0f,
        -1.0f, 1.0f, 0f, 0f, 1f,
        1.0f, 1.0f, 0f, 0.5f, 1f
    )
private static float[] getZoomData(float leftZoomRatio, float topZoomRatio, float rightZoomRatio, float bottomZoomRatio) {
        return new float[] {
                // X, Y, Z, U, V
                -1.0f + leftZoomRatio * 2, -1.0f + bottomZoomRatio * 2, 0, 0.f, 0.f,
                1.0f - rightZoomRatio * 2, -1.0f + bottomZoomRatio * 2, 0, 0.5f, 0.f,
                -1.0f + leftZoomRatio * 2, 1.0f - topZoomRatio * 2, 0, 0f, 1.f,
                1.0f - rightZoomRatio * 2, 1.0f - topZoomRatio * 2, 0, 0.5f, 1.f,
        };
    }

    private static float[] getCropData(float leftCropRatio, float topCropRatio, float rightCropRatio, float bottomCropRatio) {
        return new float[] {
                // X, Y, Z, U, V
                -1.0f,  -1.0f,  0, 0f + leftCropRatio / 2,    0.f + bottomCropRatio,
                1.0f,   -1.0f,  0, 0.5f - rightCropRatio / 2,   0.f + bottomCropRatio,
                -1.0f,  1.0f,   0, 0.f + leftCropRatio / 2,    1.f - topCropRatio,
                1.0f,   1.0f,   0, 0.5f - rightCropRatio / 2,   1.f - topCropRatio,
        };
    }

peerless2012 avatar Jul 20 '21 12:07 peerless2012

这么改就可以了吧 void main() { vec4 color = texture2D(sTexture, vec2(vTextureCoord.x - 0.5, vTextureCoord.y)); vec4 color2Map = vec4(1.0, 1.0, 1.0, 1.0); color2Map = texture2D(sTexture, vec2(vTextureCoord.x, vTextureCoord.y)); gl_FragColor = vec4(color.r, color.g, color.b, color2Map.g); }

ithour avatar Aug 02 '21 06:08 ithour

我试了试,主要改两个地方。 1 frag.sh, 修改成从左边取色,右边取透明度

#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sTexture;

void main() {
    vec4 color = texture2D(sTexture, vTextureCoord);
    vec4 color2Map = vec4(1.0, 1.0, 1.0, 1.0);
    if (vTextureCoord.x < 0.5) {
        color2Map = texture2D(sTexture, vec2(vTextureCoord.x + 0.5, vTextureCoord.y));
        gl_FragColor = vec4(color.r, color.g, color.b, color2Map.g);
    } else {
        gl_FragColor = vec4(color.r, color.g, color.b, color.a);
    }
}

2 render的uv坐标,贴纹理的左半部分

private var halfRightVerticeData = floatArrayOf(
        // X, Y, Z, U, V
        -1.0f, -1.0f, 0f, 0f, 0f,
        1.0f, -1.0f, 0f, 0.5f, 0f,
        -1.0f, 1.0f, 0f, 0f, 1f,
        1.0f, 1.0f, 0f, 0.5f, 1f
    )
private static float[] getZoomData(float leftZoomRatio, float topZoomRatio, float rightZoomRatio, float bottomZoomRatio) {
        return new float[] {
                // X, Y, Z, U, V
                -1.0f + leftZoomRatio * 2, -1.0f + bottomZoomRatio * 2, 0, 0.f, 0.f,
                1.0f - rightZoomRatio * 2, -1.0f + bottomZoomRatio * 2, 0, 0.5f, 0.f,
                -1.0f + leftZoomRatio * 2, 1.0f - topZoomRatio * 2, 0, 0f, 1.f,
                1.0f - rightZoomRatio * 2, 1.0f - topZoomRatio * 2, 0, 0.5f, 1.f,
        };
    }

    private static float[] getCropData(float leftCropRatio, float topCropRatio, float rightCropRatio, float bottomCropRatio) {
        return new float[] {
                // X, Y, Z, U, V
                -1.0f,  -1.0f,  0, 0f + leftCropRatio / 2,    0.f + bottomCropRatio,
                1.0f,   -1.0f,  0, 0.5f - rightCropRatio / 2,   0.f + bottomCropRatio,
                -1.0f,  1.0f,   0, 0.f + leftCropRatio / 2,    1.f - topCropRatio,
                1.0f,   1.0f,   0, 0.5f - rightCropRatio / 2,   1.f - topCropRatio,
        };
    }

您好,试了一下您的方法,没有成功,您成功了吗

grimmDi avatar Sep 23 '21 07:09 grimmDi

我试了试,主要改两个地方。 1 frag.sh, 修改成从左边取色,右边取透明度

#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sTexture;

void main() {
    vec4 color = texture2D(sTexture, vTextureCoord);
    vec4 color2Map = vec4(1.0, 1.0, 1.0, 1.0);
    if (vTextureCoord.x < 0.5) {
        color2Map = texture2D(sTexture, vec2(vTextureCoord.x + 0.5, vTextureCoord.y));
        gl_FragColor = vec4(color.r, color.g, color.b, color2Map.g);
    } else {
        gl_FragColor = vec4(color.r, color.g, color.b, color.a);
    }
}

2 render的uv坐标,贴纹理的左半部分

private var halfRightVerticeData = floatArrayOf(
        // X, Y, Z, U, V
        -1.0f, -1.0f, 0f, 0f, 0f,
        1.0f, -1.0f, 0f, 0.5f, 0f,
        -1.0f, 1.0f, 0f, 0f, 1f,
        1.0f, 1.0f, 0f, 0.5f, 1f
    )
private static float[] getZoomData(float leftZoomRatio, float topZoomRatio, float rightZoomRatio, float bottomZoomRatio) {
        return new float[] {
                // X, Y, Z, U, V
                -1.0f + leftZoomRatio * 2, -1.0f + bottomZoomRatio * 2, 0, 0.f, 0.f,
                1.0f - rightZoomRatio * 2, -1.0f + bottomZoomRatio * 2, 0, 0.5f, 0.f,
                -1.0f + leftZoomRatio * 2, 1.0f - topZoomRatio * 2, 0, 0f, 1.f,
                1.0f - rightZoomRatio * 2, 1.0f - topZoomRatio * 2, 0, 0.5f, 1.f,
        };
    }

    private static float[] getCropData(float leftCropRatio, float topCropRatio, float rightCropRatio, float bottomCropRatio) {
        return new float[] {
                // X, Y, Z, U, V
                -1.0f,  -1.0f,  0, 0f + leftCropRatio / 2,    0.f + bottomCropRatio,
                1.0f,   -1.0f,  0, 0.5f - rightCropRatio / 2,   0.f + bottomCropRatio,
                -1.0f,  1.0f,   0, 0.f + leftCropRatio / 2,    1.f - topCropRatio,
                1.0f,   1.0f,   0, 0.5f - rightCropRatio / 2,   1.f - topCropRatio,
        };
    }

您好,试了一下您的方法,没有成功,您成功了吗

成功的,上面代码就是从我改造的里面拷贝出来的。你再好好检查检查。

peerless2012 avatar Sep 24 '21 08:09 peerless2012

您好,试了一下您的方法,没有成功,您成功了吗

成功的,上面代码就是从我改造的里面拷贝出来的。你再好好检查检查。

您好,您的测试代码能发我一下吗http://qn.aiyashequ.cn/test/0000V.mp4,或者如果您有时间,这个能帮我调试一下吗,非常感谢

grimmDi avatar Sep 24 '21 09:09 grimmDi

您好,试了一下您的方法,没有成功,您成功了吗

成功的,上面代码就是从我改造的里面拷贝出来的。你再好好检查检查。

您好,您的测试代码能发我一下吗http://qn.aiyashequ.cn/test/0000V.mp4,或者如果您有时间,这个能帮我调试一下吗,非常感谢

你如果运行的是这个项目的工程,需要注意把App的build.gradle里面依赖由maven改成libraries,它默认用的是maven库的版本。

peerless2012 avatar Sep 24 '21 11:09 peerless2012

您好,试了一下您的方法,没有成功,您成功了吗

成功的,上面代码就是从我改造的里面拷贝出来的。你再好好检查检查。

您好,您的测试代码能发我一下吗http://qn.aiyashequ.cn/test/0000V.mp4,或者如果您有时间,这个能帮我调试一下吗,非常感谢

image

peerless2012 avatar Sep 24 '21 11:09 peerless2012

您好,试了一下您的方法,没有成功,您成功了吗

成功的,上面代码就是从我改造的里面拷贝出来的。你再好好检查检查。

您好,您的测试代码能发我一下吗http://qn.aiyashequ.cn/test/0000V.mp4,或者如果您有时间,这个能帮我调试一下吗,非常感谢

对调透明区域和颜色区域你可以参考下,随便写的,只是验证下。

peerless2012 avatar Sep 24 '21 11:09 peerless2012

这么改就可以了吧 void main() { vec4 color = texture2D(sTexture, vec2(vTextureCoord.x - 0.5, vTextureCoord.y)); vec4 color2Map = vec4(1.0, 1.0, 1.0, 1.0); color2Map = texture2D(sTexture, vec2(vTextureCoord.x, vTextureCoord.y)); gl_FragColor = vec4(color.r, color.g, color.b, color2Map.g); }

我用了这段代码可以正常展示

Leeeyou avatar Oct 14 '21 03:10 Leeeyou

您好,试了一下您的方法,没有成功,您成功了吗

成功的,上面代码就是从我改造的里面拷贝出来的。你再好好检查检查。

您好,您的测试代码能发我一下吗http://qn.aiyashequ.cn/test/0000V.mp4,或者如果您有时间,这个能帮我调试一下吗,非常感谢

对调透明区域和颜色区域你可以参考下,随便写的,只是验证下。

非常感谢您的指导

grimmDi avatar Oct 20 '21 08:10 grimmDi