AVMutableVideoCompositionLayerInstructionの使い方
( iOS )ビデオ用の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
関連の知識はないと結構何がなんだかわからなくなるのであらかじめ知識として
蓄えておくことはは必須ですね。