AVFoundationは似たり寄ったりな長い名前のクラスを多数使用するため、取っ付きにくい部分がありますが、仕組みとしてはとてもシンプルです。クラスを勉強する前にiMovieなどの動画編集ソフトで軽く遊んでみると飲み込みが早いように思います。
まずはコードに入る前に基本的なクラスの働きを、動画の構造体と照らし合わせながら見ていきます。
##はじめに
動画を編集するためには、大きく分けるとAVMutableCompositionとAVMutableVideoCompositionInstructionという2つのクラスを使用します。
まず、AVMutableCompositionで編集したい動画を割当て、AVMutableVideoCompositionInstructionで動画に対する編集内容を設定していくイメージです。
そして最終的にAVAssetExportSessionでビデオファイルに変換させます。
これからこの3つのクラスについての基本的な仕組みを説明していきます。
AVMutableComposition
下記の図は、AVMutableCompositionクラスを用いて動画をどのように保持していくかを示しています。どこか少しだけiMovieで動画編集する時の様子と似ているようにも思えます。
このAVMutableCompositionクラスは動画全体を扱います。
動画を挿入したり削除したりする場合はこのクラスを使用します。
また、AVAssetの派生クラスでもあるため、AVPlayerにアセットとして与えて動画を再生することもできます。
AVPlayerでの使用例
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:AVMutableComposition];
※AVPlayerでの動画再生方法は[AVFoundationの基礎知識]
(http://qiita.com/Yuchi/items/1f7a4658c1ee396adfa0)をご覧ください。
AVMutableCompositionはAVMutableCompositionTrackをいくつか保持することができます。
(理由は分かりませんが、私がデバックを行った時は15コまで保持する事ができました。)
###AVMutableCompositionTrack
こちらは動画編集ソフトで言うところの「トラック」で、1コ〜複数コのAVAssetTrackが含まれます。
動画の編集内容はこのAVMutableCompositionTrack毎に指定していくので、どのように編集するかによってトラックの個数やAVAssetTrackの挿入位置などを決めていかなければいけません。
AVMutableCompositionTrackはビデオトラックとオーディオトラックが設定できますので、音楽を入れる場合もこのクラスを使用します。
###AVAssetTrack
ここには編集したい元動画を入れていきます。
単純に元動画をクロップして繋ぎ合わせたい場合は、AVMutableCompositionTrackにこのAVAssetTrackをどんどん追加していきましょう。
##AVMutableVideoCompositionInstruction
AVMutableCompositionでは編集したい動画を保持していきましたが、このクラスはトラックの操作(アニメーションの付加等)を設定していきます。
そしてこのクラスもまたAVMutableVideoCompositionLayerInstructionというクラスを複数個保持することができます。
###AVMutableVideoCompositionLayerInstruction
実際にトラックの操作(透過、移動、クロップ)を設定するにはこちらのクラスを利用します。もちろん開始時間、継続時間も同時に設定します。
上の図では1つのAVMutableCompositionTrackに対して1つのAVMutableVideoCompositionLayerInstructionを使用しているイメージとなります。
しかし、1つのAVMutableCompositionTrackに対して複数のAVMutableVideoCompositionLayerInstructionを構築することも可能ですので、より複雑な編集も効率よく行えます。
###AVMutableVideoComposition
AVMutableCompositionと名前は似ていますが、こちらのクラスではAVMutableCompositionに対する付加情報を設定していきます。
具体的には、フレームの長さやレンダリングサイズ、そして先ほどでてきたトラックの操作(AVMutableVideoCompositionInstruction)です。
このAVMutableVideoCompositionをAVPlayerやExportのクラスに渡す事でビデオに付加情報がセットされます。
##AVAssetExportSession
最後にエクスポート用のクラスです。
今までに大きく2つのクラスを生成してセットしてきました。
これらの情報をAVAssetExportSessionに代入し、ビデオのクオリティやアウトプット用のパスなどを設定すればビデオファイルの出来上がりです。