手順2(ビデオ編集ソフトで動画ファイルを出力するまで)を終えていることが前提で記載しています。
以下は手順3のエンコードをバッチスクリプトで処理するための説明です。
1.準備
使用するアプリケーションの導入と設定、フォルダの設定が完了している必要があります。
アプリケーションの導入と設定はそれぞれのアプリケーションの導入と設定のページを参照してください。
フォルダの設定はこちらを参照してください。
2.プログラムについて
(1)機能
・入力は、映像:AVI形式(RGB32)、音声:PCM形式 (プログラムを編集すれば変更可能)
・出力は、映像:MP4形式、音声:HE-AACV2形式 (プログラムを編集すれば変更可能)
・バッチファイルに、Drag&Dropするだけの簡単操作
・複数ファイルのDrag&Dropにも対応
・AVSファイルを生成 (入力は、音声付AVI形式のファイルを想定、それ以外では動作しません)
・3パスエンコード(プログラムを編集すれば変更可能)
・簡易実行ログファイル生成(エラーハンドリングはしていませんので、標準エラー出力をチェックしてください)
・【入力ファイル名】をキーワードに、所定の場所へフォルダおよびファイルを作成
・各処理をサブルーチン化
(不要な処理はCall文をコメントにするとスキップできます。サブルーチン化により機能の追加編集が容易になったと思います。)
(2)プログラム本体
実際に使用しているプログラムです。
以下のリンクからダウンロードできます。(ZIPで解凍してください)
2010.06.07 更新 encode_zoome_20100607.zip
入力ファイルがAVI形式の場合とASF形式(.wmv)の場合でプログラムを分けていましたが、
メンテナンス性が悪いので2つをあわせて1つにしました。
if文で拡張子を条件にAVSスクリプトファイル生成箇所を選択する様にしてあります。
※映像ファイルの上書きがうまくできていなかったので修正しました。
WMV用のAVSスクリプトは、DirectShowSourceを使っているのでAVI以外の多種形式を読込めると思いますが、このプログラムでは拡張子チェックでaviかwmvでなければエラーになります。
一時的に、.wmvにすれば処理可能だとおもいますが、実際のところはDirectShowSourceが対応しているか否かです。
AVI形式の場合は、ビデオ編集ソフト側でオーバレイ編集(チャット欄を隠す処理)した場合を想定しています。WMV形式の場合は、ビデオ編集ソフトにWindows ムービーメーカを使用し、オーバレイ編集していない場合を想定してますので、その分、画像の準備や位置調整などの作業が追加で必要になります。
また、どちらの場合も音声が含まれていることが前提です。
注意事項などは、下の赤文字箇所を参照ください。
いろいろ気になる箇所があって、とりあえずな箇所が多々あるプログラムです。
すべての環境を想定してテストできていませんのでご了承ください。
そもそもUNIXからはじめた自分にとっては、Windowsバッチには慣れていないので使いにくいというのが本音で、どうせならWSHかPowerShellに変えようかと思案中です。
たかがこれだけのために・・・というのもあるんですが
※フォルダ構成の(1),(2)の場合に動作します。異なる場合は編集が必要です。
※プログラムの説明は、(3)以降をご覧ください。
※x264でcolormatrixオプションは使用しないよう変更しました。
※入力ファイルの色空間はRGB系を想定しています。それ以外の場合はConvertToYV12でエラーになります。(matrixオプションを削除すればエラーは発生しないと思います)
※使用に際しては、自己責任でお願いします。
(3)プログラム解説
以下のブロックで構成されています。
①初期設定1
②x264エンコード設定
③作業ディレクトリチェック
④パラメータチェック
⑤初期設定2
⑥エンコード開始 【start_label】
⑦AVSファイル生成 【avs_cr】※拡張子がaviかどうかで分岐
⑧x264エンコード実行(1pass)【video_x264_pass1】
⑨x264エンコード実行(3pass)【video_x264_pass3】
⑩x264エンコード実行(2pass)【video_x264_pass2】
⑪音声AACエンコード 【audio_aac_enc】
⑫映像と音声合成 【mp4box_mux】
⑬エンコード終了 【end_label】
※入力ファイルが複数ある場合は、④~⑬を繰り返し実行します。
※⑥~⑬の処理は、サブルーチンにしてありますので、Call文でそれぞれ呼び出しています。(61行目~69行目)
※サブルーチンの終わりはEOF(End Of File)へ移動させています。編集中に誤ってEOFを削除しないよう注意して作業してください。
※VideoStudioで出力する際、音声をデフォルト(PCM)以外の形式(たとえばMP3)にした場合は、正常に動作しません。
※複数の入力ファイルを処理した場合に、エラーが発生するとすべて処理が中断します。
※同じ入力ファイル名で再度実行した場合は、すべて上書きされます。
※ログファイルを出力しますが、出力できるだけのレベルですので各コマンドの実行結果(エラーメッセージなど)は、コマンドプロンプトの画面(標準出力と標準エラー出力)で確認してください。ただし、標準設定のままでは、バッファサイズが少ないためすべてを表示できません。規定値の設定で、バッファサイズを増やしておいてください。
(4)ユーザ環境変数
変数名 | 入力値 | 備考 |
---|---|---|
WORK | D:moviesworkzoome | 作業フォルダ名 |
logfile | D:log%~n0.log | 実行ログファイル名 |
DSTDIR | D:movieszoome | 出力先フォルダ名 |
X264_CMD | “C:Program Files (x86)meguitoolsx264x264.exe” | x264プログラム完全修飾名 |
AVS2WAV_CMD | “D:toolsavs2wavavs2wav.exe” | avs2wavプログラム完全修飾名 |
AACENC_CMD | “D:toolsNeroDigitalAudiowin32neroAacEnc.exe” | neroAacEncプログラム完全修飾名 |
MP4BOX_CMD | “C:Program Files (x86)meguitoolsmp4boxMP4Box.exe” | mp4boxプログラム完全修飾名 |
NAME | %~n1 | 入力ファイル名(拡張子を除く) |
SRC | %1 | 入力ファイル名 |
JPG | %~d1%~p1%~n1.jpg | オーバレイ画像のファイル名 ※入力ファイルがWMV形式の場合使用 |
AVS | %NAME%.avs | AVSファイル名 |
LOG | %NAME%.log | statsファイル名 |
WAV | %NAME%.wav | WAV音声ファイル名 |
M4A | %NAME%.m4a | AAC音声ファイル名 |
M4V | %NAME%.m4v | MP4映像ファイル名 |
MP4 | %NAME%.mp4 | MP4ファイル名 |
OPTION | 【映像エンコーダ:x264cli】共通オプションを参照 | x264の共通オプション設定 |
PASS1 | 【映像エンコーダ:x264cli】個別オプションを参照 | x264の1-pass個別オプション設定 |
PASS2 | 【映像エンコーダ:x264cli】個別オプションを参照 | x264の2-pass個別オプション設定 |
PASS3 | 【映像エンコーダ:x264cli】個別オプションを参照 | x264の3-pass個別オプション設定 |
FPS | 30 | 入力映像のFPSを明示的に設定 ※入力ファイルがWMV形式の場合に使用 |
error_message | 入力ファイルなし | エラーメッセージ設定。入力ファイルが存在しないケース。 |
AVIファイル指定なし | エラーメッセージ設定。拡張子がavi以外のケース。 | |
作業用ディレクトリなし | エラーメッセージ設定。作業フォルダ(%WORK%)が存在しないケース。 |
(5)エンコードオプション
【AVISynth】
使用フィルタ | 設定値 | 備考 |
---|---|---|
AVISource | AVISource(“%SRC%”, true) | AVIファイルの読み込み、音声付 |
ConvertToYV12 | ConvertToYV12(matrix=”PC.601″) | 色空間でフルレンジ(PCスケール)を保持 |
ChangeFPS | ChangeFPS(15.00) | FPSを30fpsから15fpsに変更 |
Spline64Resize | Spline64Resize(640,512) | 画像サイズを640×512に縮小 (アスペクト比5:4のまま) ※Avisynth2.58以降で使用可 |
【映像エンコーダ:x264cli】共通オプション(変数:%OPTION%)
使用オプション | 設定値 | 備考 |
---|---|---|
–bitrate | 1450 | ビットレート設定【kbps】 |
–level | 4.1 | AVCレベル指定 |
–sar | 1:1 | サンプルアスペクトレシオを指定 |
【映像エンコーダ:x264cli】個別オプション
使用オプション | 設定値 | 備考 |
---|---|---|
–keyint | 300 | |
–min-keyint | 1 | |
–slow-firstpass | なし | 1st pass実行時のみ指定 |
–aq-mode | 0 | |
–deblock | -2:-2 | |
–scenecut | 54 | |
–psy-rd | 0.5:0.0 | |
–qpmin | 1 | |
–qpmax | 51 | |
–qpstep | 16 | |
–ref | 5 | |
–mixed-refs | なし | |
–no-fast-pskip | なし | |
–bframes | 3 | |
–p-pyramid | strict | |
–b-adapt | 2 | |
–merange | 32 | |
–direct | auto | |
–subme | 9 | |
–trellis | 2 | |
–partitions | p8x8,b8x8,i4x4,i8x8 | |
–8x8dct | なし | |
–me | umh | |
–threads | auto | |
–threads-input | なし | |
–cqm | flat | |
–no-dct-decimate | なし | |
–fullrange | on |
・AVCレベルについては、PCで再生するのであれば指定は不要、PC以外の再生機器で使用するのであれば必ず指定が必要です。
・オプションについての詳細は、–help、 –longhelp、 –fullhelp で一覧が表示されます。(英文)
・参考にしたサイトは、こちらです。
※再生機器に対応する様にエンコードオプションは決定してください。AVCレベルとプロファイル設定がキーとなります。
※PSPは、AVCレベル3まで。XBOXはレベル4までだったと思います。ファームウェアのバージョンにより異なりますので、最新情報はそれぞれのサポートサイトで確認ください。
※AVCレベルに沿ったエンコードをする場合、コマンドラインだけで指定すると使用できないオプションも指定できてしまいます。MeGUIでValidateCheckした後、オプション記載部分をコピーして使用したほうが確実です。
※上記表の設定は、seraphy氏によるNicoNico:高画質を参考にしています。映像重視でエンコード時間が遅く再生が重くなるオプションが使われています。FPSを半分にしているので時間は幾分早くはなっているのですが、1passあたり動画時間の約2~2.5倍エンコードに時間がかかります。
※オプションの選定テスト時は、PSNRとSSIM表示を有効にして、精度を確認するのが良いと思います。ただし、AQモードを使用している場合は意味がありません。
※オプションのデフォルト値がバージョンUPにより変更になっています。また、削除されたり追加されたオプションがあります。それに併せて修正してあります。
※ここには記載していませんが、–preset、 –tuneオプションを
使用すると詳細な設定をしなくても済みます。
【音声エンコーダ:NeroAAC】
オプション | 設定値 | 備考 |
---|---|---|
-if | – | 音声入力ファイル名を指定 標準入力からの場合は-を指定。 |
-of | %M4A% | 出力ファイル名を指定 |
-cbr | 32000 | 固定ビットレート |
-hev2 | なし | HE AACV2エンコード |
※AVS2WAVの標準出力をパイプしてNeroAACの入力にしています。
3.付録1
ビデオ編集にWindows ムービーメーカなどを使用してWMV形式の動画ファイルを扱う場合は、以下の修正をすれば同じ様に動作すると思います。
ただオーバレイ処理を含んでいるので、素直にMeGUIを使った方が簡単だと思います。
①拡張子チェックにより、拡張子がavi以外の場合は、:avs_crt_wmvを実行します。
②AVISynthスクリプト生成箇所を表の通り変更
拡張子がaviの場合とは以下が異なります。
使用フィルタ | 設定値 | 備考 |
---|---|---|
ImageSource | picture=ImageSource(“%~d1%~p1%~n1.jpg”).BilinearResize(348,300) | 画像(リネ2壁紙)の読み込み ※数値は(横サイズ、縦サイズ) |
BilinearResize | 画像(リネ2壁紙)をチャット欄にあわせて縮小 | |
DirectShowSource | movie=DirectShowSource(“%SRC%”, fps=30.000, audio=true,pixel_type=”RGB32″) | WMVファイルの読み込み※意図的に色空間をRGB32出力しています。なくても可。 |
Overlay | Overlay(movie,picture,x=0,y=724,mode=”blend”,opacity=1) | 映像をメインとし画像を合成 ※yの値はチャット欄が隠れる様に微調整要、変更した場合は、BilinearResizeの縦サイズ調整も必要 |
ConvertToYV12 | ConvertToYV12(matrix=”PC.601″) | 色空間をYV12のフルレンジで変換 ※DirectShowSourceですでにYV12出力されている場合は、変換は無視されるが、matrixを指定しているとエラーになるので、その場合はコメントにしてください。 |
ChangeFPS | ChangeFPS(15.00) | FPSを30fpsから15fpsに変更 |
Spline64Resize | Spline64Resize(640,512) | アスペクト比5:4のまま1280×1024⇒640×512に縮小 |
ポイント
・WMV形式を読み込むためDirectShowSourceフィルタを使用。pixel_typeオプションがなければYV12で出力します。YV12のままでも良いのですが、フルレンジかどうかが不明だったため一旦RGBにしています。効果は不明ですのでpixel_type指定を削除するかYV12にしても可。
・チャット欄を隠すための画像を貼り付けるためオーバレイを使用。
・画像ファイル名は拡張子が.jpgで動画ファイルと同じ名前で同じフォルダに用意。
重要
BilinearResizeの縦サイズとOverlayの縦位置は、チャット欄のサイズにあわせて変更が必要です。
チャット欄のサイズを常に同じサイズにしておけば、1回目だけ調整すればあとはそのまま使用できます。
ただ、チャット欄をデフォルトのサイズから変更する場合は、ゲーム内の他のウィンドウ(たとえばマップ)の縦サイズを基準にあわせると良いと思います。
画像の比率が変わってしまいますが、横サイズ、横位置は通常変更しなくても問題ありません。
※サイズ調整には、MeGUIを利用するかAVI を読み込めるMedia Player(Media Playerクラッシックなど)を利用してください。
4.付録2
①ファイルサイズの計算式
動画には、一般的に映像と音声データが含まれます。それぞれのデータサイズの和が動画ファイルサイズになります。
映像データサイズ【MByte】=動画時間 【秒】× 映像ビットレート【kbps】÷ 1024 ÷ 8
音声データサイズ【MByte】=動画時間 【秒】× 音声ビットレート【kbps】÷ 1024 ÷ 8
動画ファイルサイズ【MByte】= 映像データサイズ + 音声データサイズ
この計算式から、動画時間に比例してファイルサイズも増加することが分かります。
※補足
ファイルサイズの「キロ:K(大文字)」は1024です。
通信速度の「キロ:k(小文字)」は1000です。
上記計算式を正確にすると、
ファイルサイズ=動画時間×ビットレート×1000÷1024÷1024÷8
赤字部分が必要になります。
ただ、この「×1000÷1024」を計算すると「0.9765625」ですので、約1として扱ってもこの場合は、少々多めに計算する分には支障はないと判断して省略しています。
この0.03の差で実用上問題になるケースは、試験問題の解答くらいでしょうか?
まぁ、サイズ算出プログラムを作るなどの場合も正確なほうが良いとは思います。
②ビットレートが1500kbpsの場合
動画ファイルサイズ【MByte】=約0.18 × 動画時間【秒】
③1分の動画の場合
動画ファイルサイズ=約11MB
④このときの画質
ビットレートが一定の場合、画質はフレームレート(1秒間のフレーム数)と画面サイズ(1280×1024など)に左右されます。
ビットレートは、1秒間に処理するデータ量になりますので、高フレームレートの場合は、1秒間のフレーム数が増え滑らかな動画になりますが、一方で1フレームを表示するのに使用できるデータ量が少なくなってしまいます。また、高解像度の場合は、1画面表示するためにより多くのデータを必要としますので不足すると画面全体がぼやけてしまいます。
実例をあげると、
ビットレート1450kbps、フレームレート15fpsにして画面サイズを1280×1024と640×512の2通りでエンコードした場合。
できあがる動画のファイルサイズは同じですが、画質はかなり変わります。
表示サイズを1280×1024は100%で、640×512は200%でそれぞれを再生した場合、再生画面は同じ1280×1024ですが画質はまったくことなり、後者の640×512を200%で再生した方がきれいに見えます。
前者の場合、ビットレート不足で全体の映像がぼやけ、更にところどころでブロックノイズが目立ちました。ビットレートをもう少し増やせば、1280×1024でもきれいに表示できるでしょうが、サイトの制限を越えてしまうと再変換されてしまい、意味がありません。
このように画質は、ビットレート、フレームレート、画面サイズが関係します。
画面サイズについては、どのサイズでも良いかというと答えはNOです。
使用しているコーデックの使用する圧縮アルゴリズムやファイル形式の仕様によりこの値は一概には言えません。2の倍数、4の倍数、8の倍数などいわれますが、縦横ともに16で割り切れる数値であれば気にしなくてすみます。
ノートパソコンや最近の液晶ディスプレイはワイド画面だったりするので、単純に縦横半分にすれば良いというケースは少ないと思います。場合によってはいらない箇所を削ってサイズ調整をしたりアスペクト比を変更したりしなければならないケースも考えられます。
⑤高圧縮率
ファイル圧縮では、元のファイルサイズからどれだけ圧縮によってサイズが小さくなったかで比較され単にファイルサイズが基準になりますが、動画の場合は、ビットレートを基準にどちらの画質がよいかで比較したり、または画質を基準にビットレートをどれだけ低くできるかで比較されます。
5.最後に
エンコードについては、アニメ番組、ホームビデオ、TV番組、DVDなど入力ソースによって設定が変わってきます。
いろいろな条件で試してみて、自分にあった設定を見つけてください。
正解はひとつではありません。
また、エンコードオプションを決める際は、時間の短いテスト用動画を用意することをお勧めします。