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 "でいいや。