「raw2qt264」の編集履歴(バックアップ)一覧に戻る

raw2qt264 - (2007/05/21 (月) 23:58:10) のソース

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

-[[バイナリー>http://members3.jcom.home.ne.jp/jacketplugin/raw2qt264.zip]]
-[[ソースコード>http://members3.jcom.home.ne.jp/jacketplugin/raw2qt264.source.zip]]

プロジェクトファイルも入っていますので、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>http://developer.apple.com/qa/qa2005/qa1455.html]]によると、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コマに指定。
// Set the maximum key frame interval, also known as the key frame rate.
err = ICMCompressionSessionOptionsSetMaxKeyFrameInterval(sessionOptions, 300);

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

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

先日QuickTime Session APIのドキュメントも色々出てきました。
http://developer.apple.com/qa/qa2005/qa1450.html
http://developer.apple.com/qa/qa2005/qa1455.html
http://developer.apple.com/qa/qa2005/qa1460.html
http://developer.apple.com/qa/qa2005/qa1456.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:&counter()
目安箱バナー