QTKit
がMavericksから廃止され、動画編集等ではAV Foundation
を使う必要がでてきた。
基本的な使い方はiOSとOS Xでほとんど変わらないが、今回はOS Xの場合。
参考になるもの
-
Transitioning QTKit Code to AV Foundation - Apple公式。
QTKit
経験者用。 - AV Foundation Programming Guide - 微妙に情報古いか間違ってる箇所があるような希ガス
Asset
まずは、Asset
について理解する。
Assetって
mov
ファイルの内容とか、Photo Library
の写真とか、アプリ内で使う素材はAsset
という単位で扱う。
分かりにくければ、最初はとりあえずファイル単位だと考えておいてもあまり問題ない。
Assetの読み込み
ファイルからAssetを作る
AVURLAsset
クラスを使って、指定したURL
の内容から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
を指定してみる。
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.asset presetName:AVAssetExportPresetAppleM4ViPod];
※ちなみに、使用可能なプリセットの一覧はexportPresetsCompatibleWithAsset:
で取得できる。
出力先/フォーマット
出力先のファイルはoutputURL
プロパティで指定する。
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
を指定。
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について。