最近接到一个需求,需要将一个绿幕视频的绿幕背景抠成透明色。并将其加到摄像机镜头上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| NSString *path = [DownLoadTool getFileWithName:[DataManage getObjectForKey:[self.uuid stringByAppendingString:@"-ar"]]];
NSURL *mediaURL = [NSURL fileURLWithPath:path]; self.item = [AVPlayerItem playerItemWithURL:mediaURL]; self.myPlayer = [AVPlayer playerWithPlayerItem:self.item]; [self.myPlayer seekToTime:kCMTimeZero]; self.movieGreen = [[GPUImageMovie alloc] initWithURL:mediaURL];
self.movieGreen.playAtActualSpeed = YES; self.movieGreen.shouldRepeat = YES; NSString*resFilename =@"1.png"; UIImage*inputImage = [UIImage imageNamed:resFilename]; self.movieNormal = [[GPUImagePicture alloc]initWithImage:inputImage smoothlyScaleOutput:YES]; NSURL *videoURl = [NSURL fileURLWithPath:path]; AVAsset *asset = [AVAsset assetWithURL:videoURl]; NSArray *array = asset.tracks; CGSize videoSize = CGSizeZero; for (AVAssetTrack *track in array) { if ([track.mediaType isEqualToString:AVMediaTypeVideo]) { videoSize = track.naturalSize; } } self.gpuImageView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 0, kWholeScreenWidth, videoSize.height*kWholeScreenWidth/videoSize.width)]; self.gpuImageView.center = self.center; self.gpuImageView.fillMode = kGPUImageFillModePreserveAspectRatio;
self.gpuImageView.backgroundColor = [UIColor clearColor]; [filteredVideoView addSubview:self.gpuImageView];
[self.movieGreen addTarget:chromaKeyBlendFilter]; [self.movieNormal addTarget:chromaKeyBlendFilter]; [chromaKeyBlendFilter addTarget:self.gpuImageView];
|
解释一下AVPlayerItem 和AVPlayer 是用来播放视频声音的
GPUImageMovie 是播放绿幕视频的
GPUImagePicture 是背景图层放透明的图片1.png
GPUImageView是父组件
chromaKeyBlendFilter是GPUImageChromaKeyBlendFilter滤镜用来过滤绿色。
运行发现GPUImageMovie 播放音画不同步。
通过搜索有大神已经贴出了相关解决办法。
就是修改GPUImageMovie.m 中的readNextVideoFrameFromOutput方法。
具体链接