LoginSignup
29
23

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-01-13

QTKitがMavericksから廃止され、動画編集等ではAV Foundationを使う必要がでてきた。
基本的な使い方はiOSとOS Xでほとんど変わらないが、今回はOS Xの場合。

参考になるもの

Asset

まずは、Assetについて理解する。

Assetって

movファイルの内容とか、Photo Libraryの写真とか、アプリ内で使う素材はAssetという単位で扱う。
分かりにくければ、最初はとりあえずファイル単位だと考えておいてもあまり問題ない。

Assetの読み込み

ファイルからAssetを作る

AVURLAssetクラスを使って、指定したURLの内容からAssetオブジェクトを作れる。

「ファイルを開く」で選んだmovファイルからAssetを作成
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
openPanel.allowedFileTypes = @[@"mov"];
[openPanel beginWithCompletionHandler:^(NSInteger result) {
    if (result == NSOKButton) {
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:openPanel.URL options:nil];
    }
}];

optionsは後で複雑な編集をするタイミングで必要になるが、ここではnilでおk。

Assetの書き出し

AVAssetExportSessionを使うと、非同期でAssetの内容をファイルに書き出すことができる。

出力オプション

AVAssetExportSessionを使ってファイルに出力する際には、出力オプションを指定する。
AV Foundation Programming Guideでは例としてAVAssetExportPresetLowQualityをハードコーディングで指定しているが、どうやらOS Xではこれは存在しない模様。

なので、今回は代わりにAVAssetExportPresetAppleM4ViPodを指定してみる。

ExportSessionを作る
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.asset presetName:AVAssetExportPresetAppleM4ViPod];

※ちなみに、使用可能なプリセットの一覧はexportPresetsCompatibleWithAsset:で取得できる。

出力先/フォーマット

出力先のファイルはoutputURLプロパティで指定する。

「保存する」ダイアログで選んだ先に出力するためのAVAssetExportSessionを作る
NSSavePanel *savePanel = [NSSavePanel savePanel];
savePanel.allowedFileTypes = @[@"m4v"];
[savePanel beginWithCompletionHandler:^(NSInteger result) {
    if (result == NSOKButton) {
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.asset presetName:AVAssetExportPresetAppleM4ViPod];
        exportSession.outputURL = savePanel.URL;
    }
}];

次に、出力フォーマットを選択する。ここは出力オプションで指定したプリセットの内容とあわせておかないとエラーになるので、今回の場合はAVFileTypeAppleM4Vを指定。

出力フォーマットはm4v
exportSession.outputFileType = AVFileTypeAppleM4V;

出力

exportAsynchronouslyWithCompletionHandler:メソッドを呼ぶと実際に処理が始まる。
名前の通り非同期で行われる。使い方は読み込みで使ったloadValuesAsynchronouslyForKeys:completionHandler:と似ている。

出力する
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    switch (exportSession.status) {
        case AVAssetExportSessionStatusCompleted:
            NSLog(@"Completed.");
            break;
        case AVAssetExportSessionStatusFailed:
            NSLog(@"Export failed: %@", exportSession.error.localizedDescription);
            break;
        default:
            break;
    }
}];

次は

Assetの読み込み/出力がわかったら、次はCompositionについて

29
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
23