AVMutableVideoCompositionLayerInstructionの使い方

ビデオ用のAVMutableCompositionTrackにレイヤーを持たせることができます。 それがAVMutableVideoCompositionLayerInstructionなんですがこれが意外と 簡単に動画に対してCGAffineTransformを指定することで動画の移動・回転・拡大縮小 ができたりフェードイン・アウトの設定ができたのでメモ。

まずは対象のトラックをもとにして、レイヤーをインスタンス化します。

+ (AVMutableVideoCompositionLayerInstruction *)videoCompositionLayerInstructionWithAssetTrack:(AVAssetTrack *)track

    AVMutableVideoCompositionLayerInstruction *layerInstruction;
    layerInstruction = [AVMutableVideoCompositionLayerInstruction
                        videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack];

TransForm

- (void)setTransformRampFromStartTransform:(CGAffineTransform)startTransform toEndTransform:(CGAffineTransform)endTransform timeRange:(CMTimeRange)timeRange

この例だと、3秒間左から動画が移動してきます。

    // transition
    CGAffineTransform rotateStart, rotateEnd;
    startTime    = kCMTimeZero;
    timeDuration = CMTimeMake(3, 1);
    rotateStart  = CGAffineTransformMakeScale(1, 1);
    rotateStart  = CGAffineTransformMakeTranslation(-720, 0);
    rotateEnd    = CGAffineTransformTranslate(rotateStart, 720, 0);
    [layerInstruction setTransformRampFromStartTransform:rotateStart
                                          toEndTransform:rotateEnd
                                               timeRange:CMTimeRangeMake(startTime, timeDuration)];

Opacity

- (void)setOpacityRampFromStartOpacity:(float)startOpacity toEndOpacity:(float)endOpacity timeRange:(CMTimeRange)timeRange

この例だと最初から3秒間動画がフェードインしてきて最後の3秒間動画をフェードアウトします。

    // fade in
    CMTime startTime, timeDuration;
    startTime    = kCMTimeZero;
    timeDuration = CMTimeMake(3, 1);
    [layerInstruction setOpacityRampFromStartOpacity:0.0
                                        toEndOpacity:1.0
                                           timeRange:CMTimeRangeMake(startTime, timeDuration)];


    // fade out
    startTime    = CMTimeSubtract(videoComposition.currentTimeDuration, CMTimeMake(3, 1));
    timeDuration = CMTimeMake(3, 1);
    [layerInstruction setOpacityRampFromStartOpacity:1.0
                                        toEndOpacity:0.0
                                           timeRange:CMTimeRangeMake(startTime, timeDuration)];

まとめ

Appleのドキュメントでこのクラスの説明をみると動画処理にしては結構シンプルだったので何個か試してみたのでした。 ただ、CMTime関連・CGAffineTransform関連の知識はないと結構何がなんだかわからなくなるのであらかじめ知識として 蓄えておくことはは必須ですね。

Ref

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVMutableVideoCompositionLayerInstruction_Class/Reference/Reference.html#//apple_ref/occ/instm/AVMutableVideoCompositionLayerInstruction/setTransformRampFromStartTransform:toEndTransform:timeRange: