2016-03-25 9 views
1

Я работаю над редактированием видео, и я успешно сделал следующее: 1.merge несколько видео. 2. Настройте скорость видео. 3. Клип-видео.Перемещение наложения на видео с сенсорным iOS

Теперь мне нужно, чтобы показать изображение поверх видео, а затем перенести этот образ над этим video.I есть две проблемы:

ПРОБЛЕМА 1: я успешно сделал наложения часть т.е. добавление изображения через video.But хау я должен переместить этот образ?

ПРОБЛЕМА 2: Также я не могу проверить предварительный просмотр видео с изображением поверх него. Я могу проверить это, если и только если я сохраню это видео. На каком-то пути, а затем воспроизведите его с помощью этого пути ,

Ниже приведен код, который я использовал для выполнения наложения задачи:

composition_ = [[AVMutableComposition alloc]init]; 
AVMutableCompositionTrack *compositionTrack = [composition_ addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

AVAssetTrack *assetTrack = [[self.asset tracksWithMediaType:AVMediaTypeVideo]firstObject]; 

[compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, self.asset.duration) ofTrack:assetTrack atTime:kCMTimeZero error:nil]; 

AVMutableVideoCompositionInstruction *videoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
videoCompositionInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, self.asset.duration); 

AVMutableVideoCompositionLayerInstruction *videoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionTrack]; 

videoCompositionInstruction.layerInstructions = @[videoCompositionLayerInstruction]; 

[videoCompositionLayerInstruction setTransform:assetTrack.preferredTransform atTime:kCMTimeZero]; 

[videoCompositionLayerInstruction setOpacity:0.0 atTime:self.asset.duration]; 
CGSize naturalSize = CGSizeMake(assetTrack.naturalSize.height, assetTrack.naturalSize.width); 


videoComposition_ = [AVMutableVideoComposition videoComposition]; 
videoComposition_.renderSize = CGSizeMake(naturalSize.width, naturalSize.height); 
videoComposition_.instructions = @[videoCompositionInstruction]; 
videoComposition_.frameDuration = CMTimeMake(1, 30); 

//start image code from here 

CALayer *overlayLayer = [CALayer layer]; 
overlayLayer.contents = (__bridge id _Nullable)([[UIImage imageNamed:@"overlay_icon.png"]CGImage]); 
overlayLayer.frame = CGRectMake(naturalSize.width/2 , naturalSize.height/2, naturalSize.width/8, naturalSize.height/8); 
overlayLayer.opacity = 0.5; 
[overlayLayer setMasksToBounds:YES]; 
overlayLayer.backgroundColor = [[UIColor redColor]CGColor]; 

CALayer *parentLayer = [CALayer layer]; 
CALayer *videoLayer = [CALayer layer]; 
parentLayer.frame = CGRectMake(0 , 0, naturalSize.width, naturalSize.height); 
videoLayer.frame = CGRectMake(0 , 0, naturalSize.width, naturalSize.height); 
videoLayer.backgroundColor = [[UIColor redColor]CGColor]; 
[parentLayer addSublayer:videoLayer]; 
[parentLayer addSublayer:overlayLayer]; 

videoComposition_.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

ответ

0

я искал везде в сети, но я не кажется, чтобы найти solution.Even яблочные документы о «Редактирование видео» не упоминайте об этом.

Наконец я пришел с моим собственным logic.Here, что я буду делать:

1.I будет захватывать видео и перейти на следующую страницу с изображением на нем. 2. Добавьте жест изображения, чтобы переместить его в любом месте над видео. 3. Затем добавьте вышеуказанный код, чтобы объединить это изображение над видео.

Я тонкий это идеальное решение. Я отправлю код через 2 дня, когда я его напишу. Но логика довольно прямолинейна.

+0

Фактически я столкнулся с той же проблемой. можете ли вы предоставить мне свой пример кода? @Reckoner –

+0

Несомненно, я предоставлю код завтра – Reckoner

+0

спасибо вам. Я жду его :) @Reckoner –

0
-(void)prepareOverlayVideo{ 

composition_ = [[AVMutableComposition alloc]init];//correct 

AVMutableCompositionTrack *compositionTrack = [composition_ addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];//correct 

[compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, self.asset.duration) ofTrack: 
[[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
          atTime:kCMTimeZero error:nil];//correct 

assetTrack = [[self.asset tracksWithMediaType:AVMediaTypeVideo]firstObject];//correct 

AVMutableVideoCompositionInstruction *videoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];//correct 

videoCompositionInstruction.timeRange = CMTimeRangeMake(kCMTimeZero,self.asset.duration);//correct 

AVMutableVideoCompositionLayerInstruction *videoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:assetTrack];//correct 

UIImageOrientation videoAssetOrientation_ = UIImageOrientationUp;//correct 
BOOL isVideoAssetPortrait_ = NO; 
CGAffineTransform videoTransform = assetTrack.preferredTransform; 
if (videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && 
    videoTransform.d == 0) { 

    videoAssetOrientation_ = UIImageOrientationRight; 
    isVideoAssetPortrait_ = YES; 
} 
if (videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) { 

    videoAssetOrientation_ = UIImageOrientationLeft; 
    isVideoAssetPortrait_ = YES; 
} 
if (videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0) { 

    videoAssetOrientation_ = UIImageOrientationUp; 
} 
if (videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0) { 

    videoAssetOrientation_ = UIImageOrientationDown; 
} 

    //[videoCompositionLayerInstruction setOpacityRampFromStartOpacity:1.f toEndOpacity:0.5f timeRange:CMTimeRangeMake(kCMTimeZero, assetTrack.timeRange.duration)]; 

// CGFloat FirstAssetScaleToFitRatio = 320.0/assetTrack.naturalSize.height; 
// CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
// [videoCompositionLayerInstruction setTransform:CGAffineTransformConcat(assetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero]; 

[videoCompositionLayerInstruction setTransform:assetTrack.preferredTransform atTime:kCMTimeZero]; 
[videoCompositionLayerInstruction setOpacity:0.0 atTime:self.asset.duration]; 

videoCompositionInstruction.layerInstructions = [NSArray arrayWithObjects:videoCompositionLayerInstruction,nil];//correct 

    if(isVideoAssetPortrait_){ 
    naturalSize = CGSizeMake(assetTrack.naturalSize.height, assetTrack.naturalSize.width); 
    } 
    else { 
    naturalSize = assetTrack.naturalSize; 
    } 

videoComposition_ = [AVMutableVideoComposition videoComposition]; 
videoComposition_.renderSize = CGSizeMake(naturalSize.width, naturalSize.height); 

videoComposition_.instructions = @[videoCompositionInstruction]; 
videoComposition_.frameDuration = CMTimeMake(1, 30); 
} 

AnimationTool Часть

 CGRect newRect = [self.view convertRect:overlayView.frame toView:videoRectView]; 
    CGFloat current_x = newRect.origin.x; 
    CGFloat current_y; 
    if(isSizeChanged && overlayView.frame.size.width>60) 
     current_y = newRect.origin.y+50; 
    else 
     current_y = newRect.origin.y; 
    overlayView.frame = newRect; 
    imageView_.frame = newRect; 

    CGPoint overlayPoint = [self mapSize:assetTrack.naturalSize withSize:playerLayer.videoRect.size forPoint:CGPointMake(current_x, current_y)]; 

    //invert Y-axis 
    CGFloat finalOverlayPoint_y = CGRectGetMaxY(CGRectMake(0, 0, naturalSize.width, naturalSize.height)) - overlayPoint.y-50; 
    CGPoint newOverlayPoint = CGPointMake(overlayPoint.x, finalOverlayPoint_y); 

    overlayView.layer.frame = CGRectMake(overlayPoint.x, newOverlayPoint.y,finalOverlayRect.size.width, finalOverlayRect.size.height); 
    imageView_.layer.frame = CGRectMake(overlayPoint.x, newOverlayPoint.y,finalOverlayRect.size.width, finalOverlayRect.size.height); 

    if(isShapeACircle) 
     imageView_.layer.cornerRadius = finalOverlayRect.size.height/2; 
    else 
     imageView_.layer.cornerRadius = 0.f; 
    imageView_.layer.borderWidth = 5.f; 

    overlayView.layer.contentsScale = [UIScreen mainScreen].scale; 
    [overlayView.layer setMasksToBounds:YES]; 

    //add animation 
    CABasicAnimation *animation1 = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    [animation1 setDuration:0.5 ]; 
    [animation1 setFromValue:[NSNumber numberWithFloat:1.0]]; 
    [animation1 setToValue:[NSNumber numberWithFloat:1.0]]; 
    //[animation1 setBeginTime:[self.timeLabel.text floatValue]]; 
    [animation1 setBeginTime:_overlayTime]; 
    [animation1 setRemovedOnCompletion:YES]; 
    [animation1 setFillMode:kCAFillModeForwards]; 
    [imageView_.layer addAnimation:animation1 forKey:@"animateOpacity"]; 

    imageView_.layer.opacity = 0.0; 
    CALayer *parentLayer = [CALayer layer]; 
    CALayer *videoLayer = [CALayer layer]; 

    parentLayer.frame = CGRectMake(0 , 0, naturalSize.width, naturalSize.height); 
    parentLayer.backgroundColor = [[UIColor redColor]CGColor]; 
    videoLayer.frame = CGRectMake(0 , 0, naturalSize.width, naturalSize.height); 

    //CALayer *watermarkLayer = [self setWaterMarkInLayer:videoLayer]; 

    [parentLayer addSublayer:videoLayer]; 
    [parentLayer addSublayer:imageView_.layer]; 
    //[parentLayer addSublayer:watermarkLayer]; 



    videoComposition_.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

// Обратите внимание, этот метод ..... Это успех часть

-(CGPoint)mapSize:(CGSize)assetTrack_size withSize:(CGSize)videoLayer_size forPoint:(CGPoint)overlay_point{ 

NSLog(@"%f",playerLayer.videoRect.size.width); 
NSLog(@"%f",playerLayer.videoRect.size.height); 
NSLog(@"%f",playerLayer.videoRect.origin.x); 
NSLog(@"%f",playerLayer.videoRect.origin.y); 


CGFloat assetTrack_width = assetTrack_size.width; 
CGFloat assetTrack_height = assetTrack_size.height; 

CGFloat videoLayer_width = videoLayer_size.width; 
CGFloat videoLayer_height = videoLayer_size.height; 

CGFloat ratio_width = assetTrack_width/videoLayer_width; 
CGFloat ratio_height = assetTrack_height/videoLayer_height; 

CGFloat new_width = overlay_point.x * ratio_width; 
CGFloat new_height = overlay_point.y * ratio_height; 

finalOverlayRect = CGRectMake(0, 0,overlayView.frame.size.width * ratio_width , overlayView.frame.size.height * ratio_height) ; 

CGPoint overlayPoint = CGPointMake(new_width, new_height); 
return overlayPoint; 
} 

@ pigeon_39 Это код overlay.I знать его немного поздно, но я некоторое время был в перерыве, и у меня не было никакого воспоминания об этом вопросе. Если это поможет вам сейчас, вы можете обратиться к этому ответу. Если у вас возникнут какие-либо проблемы, мы продолжим разговор в чате здесь. Расскажите мне, где бы вы ни застряли, но сначала сделайте исследование самостоятельно. Обратите внимание, что это не полный код, так как мне нужно будет сделать много редактирования, чтобы предоставить вам реальный код. Мой код включает в себя много условия. Весь лучший друг :-)