AV Foundationを使った動画編集(Composition)

  • 44
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

前回に引き続き。Assetを理解したら、次はCompositionの理解。

AVAssetのサブクラスにはAVURLAssetAVCompositionの二つがある。
動画編集では必然的にCompositionを使うことになるので、まず基礎から。

CompositionとTrackとAsset

  • Composition - 一つの映像作品 / プロジェクト
  • Track - Compositionを構成する映像/音声トラック
  • Asset - 各トラックの上にのせる素材

ここらへんは規正の動画編集ソフトと基本的に同じ考え方なので、もしピンとこなかったらPremiere辺りを使ってみて感覚をつかんでおいた方がいいかも。それほど複雑な話でもないけれども。

ややこしいが、CompositionAssetとして扱えるので注意。

読み込んだAssetのトラックを調べてみる

AVAssettracksプロパティを見ると、そのAssetに含まれるトラックの情報を見れる。

読み込んだファイルのトラックを見てみる
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:openPanel.URL options:nil];
NSLog(@"Tracks: %@", asset.tracks);

大抵の動画ファイルは、2トラック(映像トラック1 + 音声トラック1)から構成される。

結果
Tracks: (
    "<AVAssetTrack: 0x600000017440, trackID = 1, mediaType = vide>",
    "<AVAssetTrack: 0x600000017680, trackID = 2, mediaType = soun>"
)

なお、tracksWithMediaType:を使うとタイプを限定したトラックのリストを取得できる。

Compositionを作る

ファイルからAssetをロードする際にはAVURLAssetを使ったが、ゼロからCompositionを作る場合はAVCompositionのサブクラスであるAVMutableCompositionを使う。

Compositionを作る
AVMutableComposition *composition = [AVMutableComposition composition];

映像トラックを追加する

AVMutableComposition生成直後はトラックがない空のコンポジションとなっているので、映像トラックを一つ追加する。

編集可能な映像トラックを追加
AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

addMutableTrackWithMediaType:preferredTrackID:を呼ぶと、新しいトラックがCompositionに追加される。

  • 今回は映像トラックなのでAVMediaTypeVideoを指定したが、AVMediaTypeAudioを指定すると音声トラックが追加される。
  • preferredTrackIDに値を指定すると、任意のトラックIDをつけることができるが、特に指定する必要がない時はkCMPersistentTrackID_Invalidを指定すると、自動的にユニークなIDをつけてくれる。

映像トラックにAssetの映像を追加する

AVMutableCompositionTrackには、insertTimeRange:ofTrack:atTime:error:メソッドで他のAssetのトラックの内容を追加できる。

映像トラックにAssetの映像トラックの内容を追加
// 素材Assetの1個目のVideoトラックを使う
AVCompositionTrack *srcVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];

// 0秒のタイミングに、映像全体を追加する
[videoTrack insertTimeRange:srcVideoTrack.timeRange ofTrack:srcVideoTrack atTime:kCMTimeZero error:&error];

大体メソッド名通りなので説明不要かもしれないが、

  • TimeRange - 元素材トラックの方のどの範囲(0:30.000〜0:35.000 とか)を使うかを指定する。今回は元素材トラック全体を指定した。
  • ofTrack - 元素材トラックを指定
  • atTime - 貼付ける先のトラックのどの位置に貼付けるか

Compositionの書き出し

AVMutableCompositionAVAssetのサブクラスなので、前回使ったAVAssetExportSessionを使って同じ方法でファイルに書き出しができる。便利だね。