「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()