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