2016-01-25 3 views
1

создать видео эффект от GPUImage как этотGPUImageMovie не поддерживает альфа-канал?

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]; 
    }); 
}); 

код может работать и я получил видео эффект, как этот enter image description here

видео имеет черный фон, который является потому, что alphaMovie не играть в то же время с маскойМови?

Это то, что я хочу, чтобы создать enter image description here

Эффект видео не черный фон

Вопрос:

1: Как я могу удалить черный фон?

2: Почему у меня видео эффекта на черном фоне?

+0

@Brad Larson Пожалуйста, помогите мне .. – Allan

ответ

2

Рамка GPUImage не поддерживает поддержку функции альфа-канала. Существует функция зеленого экрана, поэтому, если вы предварительно создаете видеоролик против зеленого экрана, тогда можно разделить видео на фоне зеленого экрана. Но то, что вы здесь описываете, - это видео с альфа-каналами и второе видео, и что он не будет работать должным образом, потому что вы одновременно используете два разных видеоисточника, и они не будут синхронизироваться. Обратите внимание, что даже при использовании функции зеленого экрана возникают проблемы с точными ребрами, как описано в this blog post (включая исходный код). Основная проблема заключается в том, что края, которые близки к зеленым, но не совсем зеленым, могут обрабатываться нечетными способами с помощью рампы фильтра. Другим подходом, о котором вы можете подумать, является просто предварительная компоновка N кадров до 1 видео, прежде чем пытаться воспроизвести видео с помощью видео логики iOS.

+0

Спасибо за вашу ответственность. Но я до сих пор не знаю, как исправить эту проблему. вы могли бы отправить мне больше информации. Спасибо ~~~~ – Allan

+0

Вы пытаетесь что-то, что не поддерживается в настоящее время, насколько я знаю. Конкретные детали описаны в моем сообщении в блоге, приведенном выше, пожалуйста, посмотрите. Сообщение в блоге описывает библиотеку, которая реализует то, что я считаю лучшим решением, но, как и все, зависит от ваших конкретных потребностей. – MoDJ

+0

Я читал ваш блог снова и снова, в конце концов, я думаю, это будет проблема с вершинным шейдером. это верно ? – Allan

 Смежные вопросы

  • Нет связанных вопросов^_^