QTMovieのaddImage:forDuration: withAttributes:で使えるコーデック

QTKitを使うと簡単に動画を書き出せるよ! とQTKitのリファレンスに書いてあるけど、書き出しに使えるコーデックの記述がどこにもない。
なんでだろう? Appleプログラマに動画ソフトウェアを書かせたくないのかな? ドキュメント作らなければみんなQuickTime Proを買うと思ってるのかな? まあなんでもいいけど。

addImage:forDuration:withAttributesの概要

使い方はこんな感じ。

QTMovie* movie = [[QTMovie alloc] initToWritableFile:path error:nil];
NSDictionary* attrs = [NSDictionary dictionaryWithObjectsAndKeys:
                       imageCodec, QTAddImageCodecType, // imageCodecはNSString
                       imageQuality, QTAddImageCodecQuality, // imageQualityはNSNumber
                       nil];
[movie addImage:image forDuration:QTMakeTime(1, 30) withAttributes:attrs]; // imageはNSImage

これでmovieに1フレーム分imageが追加される。問題はattrsに何を入れるか。

QTAddImageCodecQuality

これはサンプルを読んでればすぐ見つかる。

NSNumber* imageQuality = [NSNumber numberWithLong:codecMaxQuality];

codecMaxQualityは定数でQTKitDefines.hに入ってる。他にもロスレスとかある。

QTAddImageCodecType

これが問題。本当に定数あるの? っていう感じに見つからない。
サンプルを読むと

NSString* imageCodec = @"mp4v";

とかやってて、即値とかふざけんなwwwってなる。

一応QTKitDefines.hにそれっぽい定数群はあるけど、使えるやつと使えないやつが混じってる。

片っ端から試す

混じってるんなら全部試せばいいんじゃね。以下は試した結果。

imageCodec 使えるかどうか 補足
"mp4v" YES ほどよく縮む。エンコード速度も速い。色味がシフトする。
"png " YES 少しだけ縮む。可逆。遅い。シフトなし。
"mjpa" YES かなり縮む。おそらく不可逆。速い。画質は残念。 シフトなし。
"mjpb" YES mjpaと何が違うんだ。 シフトなし。
"h263" YES すごい縮む。強制的にサイズ変更。スーパー低画質。シフトなし。
"h264" NO どういうことなの。
"avc1" NO おそらくH264コーデック。だが書き出し途中にmmap失敗してクラッシュ。さすがです。
"mjp2" YES 縮む。不可逆。速い。fpsが落ちた。シフトなし。
"yuv2" NO それっぽい名前のくせに使えない。
"raw " YES 縮まない。可逆。速い。シフトなし。
"dvpp" YES 縮む。強制的にサイズ変更。スーパー低画質。シフトなし。
"y420" YES 縮まない。可逆。速い。シフトなし。


ここまで調べて力尽きた。Elisはもう"raw "でいいや。