将抖动图标添加到视频中

时间:2012-12-15 09:13:14

标签: avfoundation

有人可以帮助我将图标合并到视频播放时应该摇晃的视频。我已将动画添加到摆动图标,但只有静态图标才会合并到视频中。如果有人能帮助我,我将非常感激。

我正在给你使用

的代码
//- (void)exportDidFinish:(AVAssetExportSession*)session{


    NSLog(@"baseView subviews : %@", [baseView subviews]);

    UIGraphicsBeginImageContext(baseView.bounds.size);
    [baseView.layer renderInContext:UIGraphicsGetCurrentContext()];
    //[self wobbleVideo:baseView];

    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    aLayer = [CALayer layer];
    aLayer.frame = CGRectMake(0, 0, 320, 380);
    aLayer.bounds = CGRectMake(0, 0, 320, 380);
    aLayer.contents = (id) resultImage.CGImage;
    aLayer.opacity = 1;
    aLayer.backgroundColor = [UIColor clearColor].CGColor;
    aLayer.geometryFlipped = YES;
    [aLayer addAnimation:[self getShakeAnimation] forKey:@"transform"];


    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:rotatedVideoUrl options:nil];
    cmp = [AVMutableComposition composition];

    AVMutableCompositionTrack *videoComposition = [cmp addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    AVMutableCompositionTrack *audioComposition = [cmp addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    AVAssetTrack *sourceVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    AVAssetTrack *sourceAudioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    [videoComposition insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:sourceVideoTrack atTime:kCMTimeZero error:nil] ;
    [audioComposition insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:sourceAudioTrack atTime:kCMTimeZero error:nil] ;


    animComp = [AVMutableVideoComposition videoComposition];
    animComp.renderSize = CGSizeMake(320, 360); 
    animComp.frameDuration = CMTimeMake(1,30);
    CALayer *parentLayer = [CALayer layer];
    CALayer *videoLayer = [CALayer layer];
    parentLayer.frame = CGRectMake(0, 0, 320, 360);
    videoLayer.frame = CGRectMake(0, 0, 320, 360); 
    [parentLayer addSublayer:videoLayer];
    [parentLayer addSublayer:aLayer];
    animComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer  inLayer:parentLayer];


    // to gather the audio part of the video
    NSArray *tracksToDuck = [cmp tracksWithMediaType:AVMediaTypeAudio];
    NSMutableArray *trackMixArray = [NSMutableArray array];
    for (NSInteger i = 0; i < [tracksToDuck count]; i++) {
        AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:[tracksToDuck objectAtIndex:i]];
        [trackMix setVolume:10 atTime:kCMTimeZero];
        [trackMixArray addObject:trackMix];
    }
    audioMix = [AVMutableAudioMix audioMix];
    audioMix.inputParameters = trackMixArray;

    AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [asset duration]);
    AVMutableVideoCompositionLayerInstruction *layerVideoInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoComposition];
    [layerVideoInstruction setOpacity:1.0 atTime:kCMTimeZero];
    instruction.layerInstructions = [NSArray arrayWithObject:layerVideoInstruction] ;
    animComp.instructions = [NSArray arrayWithObject:instruction];
    [self exportMovie:self];


}



//WOBBLE ANIMATION-------------------------------------
- (CAKeyframeAnimation*)getShakeAnimation {

    CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];

    CGFloat wobbleAngle = 0.06f;

    NSValue* valLeft = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(wobbleAngle, 0.0f, 0.0f, 1.0f)];
    NSValue* valRight = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(-wobbleAngle, 0.0f, 0.0f, 1.0f)];
    animation.values = [NSArray arrayWithObjects:valLeft, valRight, nil];

    animation.autoreverses = YES;
    animation.duration = 0.125;
    animation.repeatCount = HUGE_VALF;

    return animation;
}

1 个答案:

答案 0 :(得分:4)

使用CABasicAnimation实现您的目标。我在这里粘贴了一个样本。如果你还在面对这个问题,请看看并告诉我。

CALayer * parentLayer = [CALayer图层];     CALayer * videoLayer = [CALayer layer];

parentLayer.sublayerTransform = CATransform3DMakeRotation(0.0f, 1.0f, -1.0f, 1.0f);

 parentLayer.frame = CGRectMake(0, 0, 320, (window.bounds.size.height - 50));
videoLayer.frame = CGRectMake(0, 0, 320, (window.bounds.size.height - 50));

parentLayer.geometryFlipped = NO;
[parentLayer addSublayer:videoLayer];


//---- adding wobble image to the video ----//
for (UIImageView * individualImageViews in [baseView subviews])
{
    aLayer = [CALayer layer];

    float newY = ((window.bounds.size.height - 50) - (individualImageViews.frame.origin.y + individualImageViews.frame.size.height)); // frame is taken like this because the layer was getting flipped

    aLayer.frame = individualImageViews.frame;
    aLayer.bounds = individualImageViews.frame;
    aLayer.frame = CGRectMake(individualImageViews.frame.origin.x, newY , individualImageViews.frame.size.width, individualImageViews.frame.size.height) ;
    aLayer.bounds = CGRectMake(individualImageViews.frame.origin.x, newY , individualImageViews.frame.size.width, individualImageViews.frame.size.height);



    aLayer.contents = (id) individualImageViews.image.CGImage;
    aLayer.opacity = 1;
    aLayer.backgroundColor = [UIColor clearColor].CGColor;
    aLayer.geometryFlipped = NO;

    CABasicAnimation *trans = [CABasicAnimation animationWithKeyPath:@"transform"];

    CGFloat wobbleAngle = 0.3f;

    NSValue* valLeft;
    NSValue* valRight;


    valLeft = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(wobbleAngle, 0.0f, 0.0f, 1.0f)];
    valRight = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(-wobbleAngle, 0.0f, 0.0f, 1.0f)];

    trans.fillMode = kCAFillModeForwards;
    trans.duration = 1;
    trans.fromValue = valLeft;
    trans.toValue = valRight;
    trans.cumulative = NO;
    trans.repeatDuration = 10;
    trans.autoreverses = YES;

    //trans.autoreverses = YES;
    //trans.repeatCount = HUGE_VALF;
    //trans.fromValue = [NSNumber numberWithFloat:1.0];
    //trans.toValue = [NSNumber numberWithFloat:0.0];;

    // need this for export
    trans.beginTime = 1e-100;
    trans.removedOnCompletion = NO;

    [aLayer addAnimation:trans forKey:@"transform"];

    [parentLayer addSublayer:aLayer];
}

亲爱的。