Version 0.1.0.0 (19 Sep 2015)
dump-yuv4mpeg2 - 指定されたAVIファイルをVideo for Windowsでデコードし、YUV4MPEG2形式でダンプする
dump-yuv4mpeg2 [ options ] inputfile
dump-yuv4mpeg2はinputfileで指定されたファイルを読み込み、Video for WindowsのCODECを用いてYUY2形式(YUV422)でデコードし、YUV420形式に変換してYUV4MPEG2形式で標準出力にダンプします。
inputfileがAVIファイルであったなら、内蔵のAVIパーザーで読み込みます。 OpenDML拡張に対応しています(1GBや2GBを超えるAVIファイルも使用できます)が、インデックスを使用しているAVIファイルは使用できません。 最初のビデオストリームのフレームを、ファイルに記録されている順序でダンプするだけです。 AVIファイルではなかった場合、指定されたファイル名をそのままAVIFileOpen APIに渡します。 したがって、VirtualDubのフレームサーバーやAVI Synthのスクリプトといったファイルを直接渡せます。
いずれの場合も、最終的にYUY2形式のデータを得られなければなりません。 例えば、VirtualDubのフレームサーバーはRGBを返しますから、ffdshowなどのYUY2に変換できるVfW CODECが必要です。
ダンプ結果はmjpegtoolsのmpeg2encなどにパイプで直接渡すことができます。 optionsには以下のオプションを指定できます。
MPEG2インターレース形式で変換します。 指定しない場合はプログレッシブ形式で変換します。 プログレッシブでも、インターレースでも、各成分のサンプリング位置や出力される画素の順序は同じです。 ただし、色差成分の補間方法が違います。 おそらくこのページに書いてあることが正しいと考えられるので、そういう実装にしています。
YUY2形式では各ラインに色差成分がありますから、インターレースの影響を受けません。 また、通常、色差成分のサンプリング位置は輝度成分のサンプリング位置と同じです。 YUV420に変換する場合の色差成分のサンプリング位置は、MPEG2スキーム、つまり、上下方向は輝度成分の中間の位置になりますが、左右方向は輝度成分のある位置になります。 したがって、プログレッシブの場合には単純に上下方向に補間を行えばいいことになります。 Lanczos法などで補間すればよいのですが、ここでは単純に上下の平均をとっています。
インターレースの場合、上記のページから分かるとおり、サンプリング位置は同じですがフィールド単位で補間を行う必要があります。 最初の色差成分ラインは最初のフィールドのみを用いて補間します。 最初のラインをライン1と数えることにすると、輝度成分の第1ラインと第3ラインを使って、両ラインの上から1/4の位置の値を求めることになります。 次の色差成分ラインは次のフィールドのみを用いて補間します。 輝度成分の第2ラインと第4ラインを使って、両ラインの上から3/4の位置の値を求めることになります。 ここでは単純に3:1あるいは1:3で線形補間しています。
正しく指定しないと、動きがある画像や、2:3プルダウンしていてシーン切り替えがひとつのフレームに入ってしまった場合に問題が起きます。 影響が大きいのはインターレース素材をプログレッシブで変換した場合で、動きがある部分やシーンが切り替わったときにフィールド間で色が混ざってしまいます。
フレームレートの分母をnumにします。
AVIファイルから得られたフレームレートをnum倍して四捨五入したものをフレームレートの分子として出力します。
例えば、30fpsを33.333ms/frameとして記録していたために、フレームレートに直すときに逆数を取って1000000:33333(=30.000300003...)になってしまったような場合に有効です。
-denom 1000
とすると、30.000300003...を1000倍して四捨五入した30000が分子となり、分母は1000になります。
つまり、30000:1000が出力されます。
-denomを指定しない場合はAVIファイルから得られたフレームレートをそのまま出力します。
NTSCの場合、オールマイティなのは1001です。 30fpsならば30030:1001に、29.97fpsならば30000:1001が出力されます。
640×360の素材を16:9スクリーン用にエンコードするなら-par 1:1
です。
NTSCのSD(704×480)を4:3スクリーン用にエンコードするなら-par 10:11
です。
高さを基準に考えると、704×480を4:3にするのですから、幅を640ピクセル分にしなければなりません。
実際には704ピクセルあるわけですから、ピクセルの幅を640:704=10:11にしなければなりません。
これがピクセルアスペクトレシオです。
NTSCのSDを16:9スクリーン用にエンコードするなら704×480を16:9にするので、幅2560/3ピクセル分になります。
PARは2560/3:704で-par 40:33
です。
1440×1080の素材を16:9スクリーン用にエンコードするなら1920:1440なので-par 4:3
です。
Written by akamoz.jp
Copyright (c) 2015 akamoz.jp
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
YUV4MPEG(5) mjpegtools(1)
$Id: dump-yuv4mpeg2.htm,v 1.1 2015/09/27 15:56:07 you Exp $