最近接到一個需求,需要將一個綠幕視頻的綠幕背景摳成透明色。并將其加到攝像機(jī)鏡頭上。
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濾鏡用來過濾綠色。
運行發(fā)現(xiàn)GPUImageMovie播放音畫不同步。
通過搜索有大神已經(jīng)貼出了相關(guān)解決辦法。
就是修改GPUImageMovie.m中的readNextVideoFrameFromOutput方法。
具體鏈接