QuickTime Programing

最終更新:

quicktimeprogramer

- view
管理者のみ編集可
raw movieをQuickTimeのH.264 codecを使って圧縮するMac用プログラム。現状ffmpegをフロントエンドに使ったコマンドラインで、パス数指定ができます。


プロジェクトファイルも入っていますので、Xcode2.2以降(インストールオプションで10.4 Universal SDKを追加)が入っていれば、プロジェクトメニューから「アクティブなビルド構成を設定=>Release 」を選んで、ワンクリックでビルド出来ます。

2006.1.21 Universal Binaryにしました。変更3カ所のみ!

2006.1.23 mplayerをfront endに使うには...
mplayerにパッチ当てちゃえ。ファイル名が"-"だったらstdoutに出す。
% raw2qt264 2 1000 "mplayer in.mpg -vo yuv4mpeg:file=-" out.mov
と思ったらmplayer、stdoutに色々出すのね。raw2qt264でrawデータ以外は捨てる様にしました。が、なぜかmplayerのraw出力は初めの2コマが緑...orz
--- vo_yuv4mpeg.20060123.c	2006-01-23 11:14:04.000000000 +0900
+++ vo_yuv4mpeg.c	2006-01-23 11:14:25.000000000 +0900
@@ -142,7 +142,10 @@
 	write_bytes = image_width * image_height * 3 / 2;
 	image = malloc(write_bytes);

-	yuv_out = fopen(yuv_filename, "wb");
+	if(strcmp(yuv_filename, "-") != 0)
+		yuv_out = fopen(yuv_filename, "wb");
+	else
+		yuv_out = stdout;
 	if (!yuv_out || image == 0)
 	{
 		mp_msg(MSGT_VO,MSGL_FATAL,

2006.2.9 圧縮設定研究中

  • kICMCompressionSessionOptionsPropertyID_MaxKeyFrameInterval
300固定にしてますが、デフォルトの0(automatic)なら、自動的にシーンチェンジでキーフレーム(I-frame)入れてくれてました(MovieVideoChartで確認)。
  • kICMCompressionSessionOptionsPropertyID_Depth
デフォルトk24RGBPixelFormatなんですが、ソースのrawvideoが420なんでk2vuyPixelFormat(2vuy)でも情報量的にはいいハズ。で、やってみると、Codec対応しているのか、指定レートよりかなり小さくなっちゃうけど(バグ?)、HDDは稼げます。見た目も変わらん(様に見える)。
  • kICMCompressionSessionOptionsPropertyID_Quality
AppleのQAによると、codecNormalQualityがデフォルトなんで、codecMaxQualityとか指定してみたが、圧縮時間も見た目も変わらず。

画質的を見るのに客観的な評価ソフトが必要ですね...

2006.3.10 Decompress Sessionで、ガンマ値を設定すれば白くならない。コマンドの引数がに必要か。

Fixed gammaLevel = kQTCCIR601VideoGammaLevel; // = 2.2
ICMImageDescriptionSetProperty(imageDesc, kQTPropertyClass_ImageDescription, 
                               kICMImageDescriptionPropertyID_GammaLevel,
                               sizeof(gammaLevel), &gammaLevel);

コメント

  • 初めの2コマが緑の件。libmpeg2 decoder delayというものがあるそうです。"-vfm ffmpeg"で回避できる可能性があります。デフォルトは"-vfm libmpeg2" -- ばる (2006-01-26 21:57:23)
  • "-vfm ffmpeg"でやってみました。緑のコマは1コマに減りました...
Using (default) progressive frame mode.==========================================================================
Trying to force video codec driver family ffmpeg...
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffmpeg2] vfm:ffmpeg (FFmpeg MPEG 2)

  • QuickTimeのバージョンが7.1超えた頃からエンコード結果が変になってしまっているのですが…。 -- Yoshiki (2006-07-31 21:31:24)
  • ソースによって指定サイズを守らない、って奴でしょうか?実はパス数/ビットレートを0でQTにまかせるようにしてから(リンク先は今日更新しました)、指定のテストしてないんです。 -- 名無しさん (2006-08-03 06:52:15)
  • 前のバージョンでは7.1以上だとブロックノイズ状の画像破綻が断続的に発生してました。新しいバージョンだとパス指定もビットレート指定も無視されますね…。以上、遅くなりましたが報告です。 -- Yoshiki (2006-08-23 22:59:42)


使い方

% raw2qt264 Pass Kbps rawCommand outFile.mov
rawCommandはyuv4mpegpipe形式をstdoutに出す命令です。

  • inFile.mpgを2パス、1000KbpsでoutFile.movに変換
% raw2qt264 2 1000 "ffmpeg -i inFile.mpg -vcodec rawvideo -f yuv4mpegpipe -" outFile.mov

  • ffmpegでインターレース解除,640x480にスケース,90%クロップ
% raw2qt264 2 1000 "ffmpeg -i inFile.mpg -deinterlace -s 640x480 -croptop 24 -cropbottom 24 -cropleft 32 -cropright 32 -vcodec rawvideo -f yuv4mpegpipe -" outFile.mov

メモ

  • 自分でプライオリティーを下げています。
setpriority(PRIO_USER, 0, 10);

  • 圧縮設定は createCompressionSession() で行っており、設定出来る項目と説明は以下にあります。
/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/QuickTime.framework/Versions/A/Headers/ImageCompression.h
の、Properties of compression sessions options objects.

  • Key frame rate (Iフレーム出現間隔)は300コマ(NTSCなら10秒)に1コマに指定。
err = ICMCompressionSessionOptionsSetMaxKeyFrameInterval(sessionOptions, 300);

MaxPartialSyncFrameInterval・AllowFrameTimeChanges・DataRateLimits(Hard limit)等、興味深い設定もありますが、デフォルトのままにしています。

以下のAppleのサンプルコードを参考に作りました。
http://developer.apple.com/samplecode/CaptureAndCompressIPBMovie/CaptureAndCompressIPBMovie.html


  • ffmpegメモ
ffmpegでrawvideoなmovなりaviを作ったときに、QTPlayerで開けるようにするには、-vtag j420とする。
% ffmpeg -i in.mpg -acodec pcm_s16le -vcodec rawvideo -vtag j420 -deinterlace out.mov
% ffmpeg -i in.mpg -acodec pcm_s16le -vcodec rawvideo -vtag j420 -deinterlace out.avi

Visitors: -
目安箱バナー