2016-03-25 34 views
1

我一直在努力进行视频编辑,我已成功完成以下工作: 1.合并多个视频。 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知道代码它有点晚了,但我休息了一段时间,我什么也没有回忆这个问题。如果它现在对你有帮助,你可以参考这个答案。如果你遇到任何问题,我们可以继续谈话在这里聊天。问我无论你卡在哪里,但你自己的第一个做一些研究。请注意,这不是完整的代码,因为我将不得不做很多的编辑,以提供实际的代码。我的代码涉及到很多conditions.All最好的队友:-)