video中的AVfoundation模糊背景
在我的应用程序中,我已经修复了1280 x 720的合成渲染大小。因此,如果将导入任何肖像video,那么我必须显示模糊背景填充和纵向框架的video中心。 像这样:
我实现了使用AVMtableComposition
播放这两个video,但我不知道如何模糊特定的背景音轨。 我没有在我的代码中:
self.composition = [AVMutableComposition composition]; AVAsset *firstAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ScreenFlow_Blend" ofType:@"mp4"]]]; [self addAsset:firstAsset toComposition:self.composition withTrackID:1]; [self addAsset:firstAsset toComposition:self.composition withTrackID:2]; // [self addAsset:ThirdAsset toComposition:self.composition withTrackID:3]; AVAssetTrack *backVideoTrack = [firstAsset tracksWithMediaType:AVMediaTypeVideo][0];; self.videoComposition = [AVMutableVideoComposition videoComposition]; self.videoComposition.renderSize = CGSizeMake(1280, 720); self.videoComposition.frameDuration = CMTimeMake(1, 30); AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; instruction.timeRange = [backVideoTrack timeRange]; CGFloat scale = 1280/backVideoTrack.naturalSize.width; CGAffineTransform t = CGAffineTransformMakeScale(scale, scale); t = CGAffineTransformTranslate(t, 0, -backVideoTrack.naturalSize.height/2 + self.videoComposition.renderSize.height/2); AVMutableVideoCompositionLayerInstruction *frontLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstruction]; frontLayerInstruction.trackID = 1; [frontLayerInstruction setTransform:t atTime:kCMTimeZero]; CGFloat scaleSmall = 720/backVideoTrack.naturalSize.height; CGAffineTransform translate = CGAffineTransformMakeTranslation(self.videoComposition.renderSize.width/2 - ((backVideoTrack.naturalSize.width/2)*scaleSmall),0); CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleSmall,scaleSmall); CGAffineTransform finalTransform = CGAffineTransformConcat(scaleTransform, translate); CGAffineTransform t1 = CGAffineTransformMakeScale(scaleSmall,scaleSmall); t1 = CGAffineTransformTranslate(t1,1280, 0); AVMutableVideoCompositionLayerInstruction *backLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstruction]; backLayerInstruction.trackID = 2; [backLayerInstruction setTransform:finalTransform atTime:kCMTimeZero]; // AVMutableVideoCompositionLayerInstruction *maskLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstruction]; // maskLayerInstruction.trackID = 3; // [maskLayerInstruction setTransform:t atTime:kCMTimeZero]; instruction.layerInstructions = @[backLayerInstruction,frontLayerInstruction]; self.videoComposition.instructions = @[ instruction ]; AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:self.composition]; playerItem.videoComposition = self.videoComposition; self.player = [AVPlayer playerWithPlayerItem:playerItem]; AVPlayerLayer *newPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:[self player]]; [newPlayerLayer setFrame:[[[self playerView] layer] bounds]]; // [newPlayerLayer setHidden:YES]; [[[self playerView] layer] addSublayer:newPlayerLayer]; [self setPlayerLayer:newPlayerLayer];
使用上面的代码我可以实现这一点:
https://drive.google.com/open?id=0B2jCvCt5fosyOVNOcGZ1MU1laEU
我知道customVideoCompositor
类来过滤combobox架。 我尝试过,但如果我使用customVideoCompositor
那么我失去了我对组成层的转换。 另外,从customVideoCompositor
我不知道如何过滤一个特定的曲目ID。
如果有人有任何文档链接或build议,那么真的很感激在这里前进。
在添加位于屏幕中央的第二个video图层之前,添加此代码
UIVisualEffect *blurEffect; blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];//Change the effect which you want. UIVisualEffectView *visualEffectView; visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; visualEffectView.frame = self.view.bounds; [self.view addSubview:visualEffectView];
在Swift中
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light) //Change the style which suites you let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = view.bounds blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // for supporting device rotation view.addSubview(blurEffectView)
一种方法是使用2个不同的AVPlayer
和一个模糊覆盖视图 : backgroundLayer
– > bluer overlay view
– > frontLayer
。 你只需要确保两个玩家同时开始和停止。
另一种select是使用1个AVPlayer
和一个time observer
。 在每一帧中提取frontLayer
的当前图像,将frontLayer
模糊并显示在backgroundLayer
。 模糊function可以在我上面提供的相同链接中find。