2016-03-25 30 views
1

私はビデオ編集に取り組んでおり、次のことを成功させました: 1.複数のビデオをマージします。 2.ビデオの速度を調整します。 3.ビデオクリップ。タッチでビデオにオーバーレイを移動する

問題1:

今、私はビデオの上に画像を表示し、そのvideo.I上でそのイメージを移動する必要があり、2つの問題を抱えて を私は正常にどのように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に「ビデオ編集」についてのリンゴのドキュメントを見つけるように見えるしません:以下

は、私は、オーバーレイのタスクを達成するために使用したコードですこれについての言及はありません。

1.Iは、ビデオをキャプチャし、その上に画像を次のページに移動します:

は最後に、私は私が何をするかである私自身logic.Hereを思い付きました。 2.画像上にジェスチャーを追加してビデオ上の任意の場所に移動します。 3.上記のコードを追加して、その画像をビデオにマージします。

私はこれを完璧な解決策にしています。私はコードを2日間で投稿します。しかし、この論理はかなり単純です。

+0

実際に私は同じ問題に直面しています。サンプルコードを教えてください。 @Reckoner –

+0

確かに私は明日コードを提供します – Reckoner

+0

おかげさまでありがとう....私はそれを待っています:) @レコナー –

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]; 

//このメソッドを注意してください.....これが成功の一部pigeon_39 @

-(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; 
} 

これはoverlay.Iノウハウのコードです少し遅れましたが、私はしばらく休憩していましたが、私はこの質問を思い出しませんでした。もしあなたが今あなたを助けてくれれば、この答えを参照することができます。もし問題があったら、ここでチャットしてください。あなたが立ち往生してどこにでも私に聞いてください。あなた自身の最初の研究をしてください。実際のコードを提供するために多くの編集をしなければならないので、これは完全なコードではありません。私の最高の仲間:-)

関連する問題