2016-09-04 2 views
11

В моем приложении у меня есть размер композиции рендеринга размером 1280 x 720. Так что если импортировать какое-либо портретное видео, тогда мне нужно показать размытый фон с заполнением и рамкой видео в центре. То же самое, как это:AVfoundation blur background in Video

https://www.youtube.com/watch?v=yCOrqUA0ws4

я достиг, чтобы играть как видео с помощью AVMtableComposition, но я не знаю, как размытие фона конкретного трека. Я следующий в моем коде:

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 класса фильтрации состава кадров. Я попробовал, но если я использую customVideoCompositor, то я теряю свою трансформацию на слоях композиции. Плюс, от customVideoCompositor Я не знаю, как фильтровать определенный идентификатор дорожки.

Если у кого-то есть какая-либо ссылка на документ или предложение, то действительно важно идти вперед в этом.

+0

вы можете показать свою реализацию 'addAsset: toComposition:' и 'setPlayerLayer:'? –

+0

Какое ваше видео 'backVideoTrack.naturalSize'? –

+0

backVideoTrack, naturalSize - 1920 x 1080 –

ответ

-1

Способ добиться того, что использует 2 различных AVPlayer с и a blur overlay view: backgroundLayer ->bluer overlay view ->frontLayer. Вам нужно только убедиться, что оба игрока одновременно начинают и останавливаются.

Другие варианты использования: 1 AVPlayer и time observer. Извлечь текущее изображение frontLayer на каждый кадр, размыть его и отобразить в backgroundLayer. Функция размытия может быть найдена в той же ссылке, что и выше.

+0

Пожалуйста, поймите. Он хочет сделать это во время выполнения с помощью 'AVMutablecomposition'. –

+0

Вы тоже поняли его вопрос? Он попросил любое предложение, которое может помочь. И он также не упомянул, что хочет использовать только «AVMutablecomposition». – sahara108

0

Перед добавлением второго видео слой, который находится в центре экрана, добавьте этот код

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) 
+0

Я хочу играть с видео треками. Там будет как несколько 5 видеодорожек. Динамическое размытие будет изменяться во время выполнения для нескольких треков и то же самое, что я хочу экспортировать в конце в виде видео. поэтому ваше решение предназначено только для размытия обработки пользовательского интерфейса, а не для редактирования видео в реальном времени. –

+0

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