Nakajijapan

生きるのに必死です。

AVMutableVideoCompositionLayerInstructionの使い方

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

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

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

1
2
3
AVMutableVideoCompositionLayerInstruction *layerInstruction;
layerInstruction = [AVMutableVideoCompositionLayerInstruction
                    videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack];

TransForm

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

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

1
2
3
4
5
6
7
8
9
10
// 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秒間動画をフェードアウトします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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: