最近接到一个需求,需要将一个绿幕视频的绿幕背景抠成透明色。并将其加到摄像机镜头上。

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是父组件
chromaKeyBlendFilterGPUImageChromaKeyBlendFilter滤镜用来过滤绿色。

运行发现GPUImageMovie 播放音画不同步。
通过搜索有大神已经贴出了相关解决办法。
就是修改GPUImageMovie.m 中的readNextVideoFrameFromOutput方法。
具体链接