【问题标题】:GPUImageMovie Not Support Alpha Channel?GPUImageMovie 不支持 Alpha 通道?
【发布时间】:2016-01-25 10:12:50
【问题描述】:

我像这样通过 GPUImage 创建视频效果

self.overlayerView = [[GPUImageView alloc] init];
self.overlayerView.frame = self.view.frame;

dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
dispatch_async(queue, ^{
    
    NSURL *sourceURL = [[NSBundle mainBundle] URLForResource:@"212121" withExtension:@"mp4"];
    GPUImageMovie *sourceMovie = [[GPUImageMovie alloc] initWithURL:sourceURL];
    sourceMovie.playAtActualSpeed = YES;
    sourceMovie.shouldRepeat = YES;
    
    sourceMovie.shouldIgnoreUpdatesToThisTarget = YES;
    
    NSURL *maskURL = [[NSBundle mainBundle] URLForResource:@"rose" withExtension:@"mp4"];
    GPUImageMovie *maskMovie = [[GPUImageMovie alloc] initWithURL:maskURL];
    maskMovie.playAtActualSpeed = YES;
    maskMovie.shouldRepeat = YES;
    
    
    NSURL *alphaURL = [[NSBundle mainBundle] URLForResource:@"rose_alpha" withExtension:@"mp4"];
    GPUImageMovie *alphaMovie = [[GPUImageMovie alloc] initWithURL:alphaURL];
    alphaMovie.playAtActualSpeed = YES;
    alphaMovie.shouldRepeat = YES;
    
    
    NSURL *topURL = [[NSBundle mainBundle] URLForResource:@"screen" withExtension:@"mp4"];
    GPUImageMovie *topMovie = [[GPUImageMovie alloc] initWithURL:topURL];
    topMovie.playAtActualSpeed = YES;
    topMovie.shouldRepeat = YES;
    
    filter0 = [[GPUImageThreeInputFilter alloc] initWithFragmentShaderFromString:@"precision highp float;uniform sampler2D inputImageTexture;uniform sampler2D inputImageTexture2;uniform sampler2D inputImageTexture3;varying vec2 textureCoordinate;void main(){vec4 video=texture2D(inputImageTexture,textureCoordinate);vec4 mv=texture2D(inputImageTexture2, textureCoordinate);vec4 alpha = texture2D(inputImageTexture3, textureCoordinate);gl_FragColor = video * (1.0 - alpha.r) + mv;}"];
    

    filter1 = [[GPUImageTwoInputFilter  alloc] initWithFragmentShaderFromString:@"\nprecision highp float;\nuniform sampler2D inputImageTexture; //video\nuniform sampler2D inputImageTexture2; //screen\nvarying vec2 textureCoordinate;\nvoid main()\n{\nvec4 video = texture2D(inputImageTexture, textureCoordinate);\nvec4 screen = texture2D(inputImageTexture2, textureCoordinate);\nmediump vec4 whiteColor = vec4(1.0);\ngl_FragColor = whiteColor - ((whiteColor - screen) * (whiteColor - video));\n}"];


    [sourceMovie addTarget:filter0];
    [maskMovie addTarget:filter0];
    [alphaMovie addTarget:filter0];
    [filter0 addTarget:filter1];
    [topMovie addTarget:filter1];

    [sourceMovie startProcessing];
    [alphaMovie startProcessing];
    [maskMovie startProcessing];
    [topMovie startProcessing];

    [filter0 forceProcessingAtSize:CGSizeMake(480,480)];
    [filter1 forceProcessingAtSize:CGSizeMake(480,480)];
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [filter1 addTarget:self.overlayerView];
    });
});

代码可以运行,我得到了这样的视频效果

视频有黑色背景是因为 alphaMovie 与 maskMovie 不同时播放?

这就是我想要创建的

效果视频无黑色背景

问题:

1:如何去除黑色背景?

2:为什么我的效果视频有黑色背景?

【问题讨论】:

  • @Brad Larson 请帮帮我..

标签: ios video gpuimage


【解决方案1】:

GPUImage 框架不包含对此类 Alpha 通道功能的支持。有一个绿屏功能,所以如果您预先制作了绿屏视频,则可以将视频从绿屏背景中分离出来。但是,您在这里描述的是一个 Alpha 通道视频和一个第二个视频,并且它无法正常工作,因为您同时从两个不同的视频源中提取并且它们不会保持同步。请注意,即使使用绿屏功能,精确边缘也存在问题,如this blog post 中所述(包括源代码)。基本问题是,接近绿色但不完全是绿色的边缘可能会被过滤器斜坡以奇怪的方式处理。您可能要考虑的另一种方法是在尝试使用 iOS 视频逻辑播放视频之前将 N 帧预组合成 1 个视频。

【讨论】:

  • 感谢您的回复,但我仍然不知道如何解决此问题。你能把更多信息发给我吗?谢谢~~~~
  • 据我所知,您正在尝试当前不支持的内容。具体细节在我上面链接的博文中有介绍,请看一下。博客文章描述了一个库,它实现了我认为更好的解决方案,但就像所有事情一样,它取决于您的具体需求。
  • 我一遍又一遍地阅读你的博客,最后我认为是顶点着色器的问题。对吗?
  • 我不确定您真正在寻找什么,是的,问题与顶点着色器有关,但它也与着色器数据的来源有关(它必须来自多个 h. 264 流同步)。无论如何,这都不是一个微不足道的问题。您可以在stackoverflow.com/questions/19550488/… 阅读有关着色器的更多信息,或者如果您想了解实际可行的解决方案,您可以查看实际可行的modejong.com/blog/post4_h_264_video_with_an_alpha_channel
  • 我正在寻找一种方法让 GPUImageMovie 同时播放两个视频。
猜你喜欢
  • 2012-10-07
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多