fc2ブログ

PREV | PAGE-SELECT | NEXT

≫ EDIT

QSVEncC+avisynthで高速自動エンコードする その2

QSVEncC+avisynthで高速自動エンコードする その1 Firefoxは情弱のたしなみ
の続きです。今回は要となるbatファイルについて書こうと思います。

QSVってなに?自分もできるかな?という人は以下の記事を御覧ください。
Aviutl+QSVでエンコードしてみる(core i7 3770+Z77) Firefoxは情弱のたしなみ

スポンサーリンク



batファイル(QSVEncC.bat)
 
@echo off

rem ###エラーメッセージ###
rem =====================================================
set error=ファイルが存在しないか、ファイル名・拡張子が間違っています
if not exist "%1" echo %error%
if not exist "%1" pause
rem =====================================================

rem ### プログラム・ファイルのパス ###
rem ====================================================
rem ### QSVEncC.exe ###
set QSVEncC_path="C:\avisynth\program\QSVEncC.exe"
rem ### avs2pipemod.exe ###
set avs2pipemod_path="C:\avisynth\program\avs2pipemod.exe"
rem ### fawcl.exe ###
set fawcl_path="C:\avisynth\program\fawcl.exe"
rem ### MP4Box ###
set mp4box_path="C:\avisynth\program\MP4Box.exe"
rem ### template.avs ###
set template=C:\avisynth\template.avs
rem ### DGindex ###
set DGindex=C:\avisynth\program\DGIndex.exe
rem ###ゴミ箱ツール###
set GB="C:\avisynth\program\GB.exe"



rem ### 出力場所 ###
rem ====================================================
set save=%~d1%~p1
set name=%~n1
echo  %save%%name%
set output_avs="%save%%name%.avs"
set output_d2v="%save%%name%.d2v"
set output_wav="%save%%name%.wav"
set output_aac="%save%%name%.aac"
set output_264="%save%%name%.264"
set output_mp4="%save%%name%.mp4"

rem ### 映像エンコード設定 ###
rem ====================================================
set qsv=--y4m -u quality --cqp 24:26:27 --gop-len 300 --bframes 3 --sar 4:3 -i - -o %output_264%

echo ====================================================
echo         ここから処理内容                  
echo ====================================================

echo ====================================================
echo          DGindex処理開始                   
echo ====================================================
%DGindex%  ^
-IF=[%~1] ^
-OF=[%save%%name%] ^
-AT=[%template%] ^
-EXIT
echo ====================================================
echo.

echo ====================================================
echo          入力AVSファイル                     
echo ====================================================
echo 入力:%output_avs%
echo ====================================================
echo.

echo ====================================================
echo           QSVEncC
echo ====================================================
%avs2pipemod_path% -y4mp %output_avs% | %QSVEncC_path% %qsv%
echo ====================================================
echo.

echo ====================================================
echo         DGindex抽出aac確定
echo ====================================================
for /f "usebackq tokens=*" %%a in (`dir /B %save%%name%*ms.aac`) ^
do @set output_DGaac="%save%%%a"
echo %output_DGaac%
echo.

echo ====================================================
echo         FAW偽装→解除                          
echo ====================================================
%fawcl_path% %output_DGaac% %output_wav%
%fawcl_path% %output_wav% %output_aac%
echo.

echo ====================================================
echo           mp4boxで結合                         
echo ====================================================
%mp4box_path% -fps 29.970 -add %output_264% -add %output_aac% -new %output_mp4%
echo.

echo ====================================================
echo                      残骸ファイル削除                       
echo ====================================================
del /f /q %output_DGaac%
del /f /q %output_avs%
del /f /q %output_d2v%
del /f /q %output_264%
del /f /q %output_wav%
del /f /q %output_aac%
if exist %output_mp4% %GB% %~1


echo.

echo 削除ファイル:
if not exist %output_DGaac% echo %output_DGaac%
if not exist %output_avs% echo %output_avs%
if not exist %output_d2v% echo %output_d2v%
if not exist %output_264% echo %output_264%
if not exist %output_wav% echo %output_wav%
if not exist %output_aac% echo %output_aac%
if not exist %~1 echo %~1
echo.

上のをコピペしてbatファイルを作ってください。
ファイル名を「QSVEncC.bat」としてC直下のavisynthフォルダへ。

batファイルの作り方や簡単な説明は、下記リンクの最初にありますのでそちらを見ていただきたいです。
Avisynth+バッチファイル+αで簡単にアニメ高速エンコード その3 Firefoxは情弱のたしなみ
 
batファイルの各部説明
(無駄に長い)
・エラーメッセージ
・変数設定
  プログラムのパス
  出力ファイル
  映像・音声エンコード設定
  
・エンコード処理
  DGindex
  QSVエンコード
  DGindex抽出aac確定
  FAW偽装→解除
  mp4boxで結合
  残骸ファイル削除
項目を並べると上のような感じになります。
大雑把にいうとこのbatにTSファイルを投げ込むと指定した所にmp4ができます。

青い部分がソフトウェアなどのアドレスを入れる所です。上に書いたところに入れてあれば書き換える必要は無いでしょう。

エラーメッセージ
set error=ファイルが存在しないか、ファイル名・拡張子が間違っています
if not exist "%1" echo %error%
if not exist "%1" pause
エラーメッセージはそのままです。
このbatファイルはTSを投げ込んで使うので、試しにダブルクリックで起動してみるとこのエラーが出ます。

変数設定(プログラム・出力・エンコード設定)

次は変数設定です。頻繁に使うパスは短く変数にした方が見やすくなります。
また、纏まっているのでパスの変更も楽なのかなと思います。

set save=%~d1%~p1
変数saveには、作業ファイルや作成されるmp4を保存して置く一時フォルダを設定します。
%~d1%~p1の意味は読み込んだTSの保存場所を示します。
もし特定のフォルダに保存したい場合は変更して下さい。

一時的な保存場所なので番組ごとに分けたい場合は、
番組ごとのフォルダを作り、振り分けソフト使うなりやbatを作るなりして振り分けて下さい。

ちなみにDGindexはなぜか変数が適用されない?ので、そこ2つも設定してください。
↑気のせいでした

set QSVEncC_path="C:\avisynth\program\QSVEncC.exe"
変数の指定方法は「set」でその後に好きな変数名、=で繋ぎダブルクオーテーションで任意のパスを囲みます。
%QSVEncC_path%
変数の展開は変数名を「%」でくくってやればおkです。


映像エンコード設定
set qsv=--y4m -u quality --cqp 24:26:27 --gop-len 300 --bframes 3 --sar 4:3 -i - -o %output_264%
映像エンコード設定では、QSVEncC.exeのオプションを参考に下の設定と同じ物を指定しました。多分。
オプションについては作者さんが公開してるのでそちらを参考に。→QSVEncCのオプションの説明

で、ここで注目して欲しいのが--sar 4:3です。地上波の解像度は16:9ではなく、1440x1080で4:3なのです。
何も設定しない状態でエンコードしてしまうと4:3のアスペクト比となってしまいますが、
sar 4:3と言うオプションを追加することで、プレーヤー再生時は16:9として試聴が可能です。
その点BS/CSの場合は1920x1080で16:9なのでsarは1:1か、設定する必要は無いです。

・・・エンコード方針で主に地上波アニメ対象と書いたのはこれが原因で、
sar 4:3にした状態で自動化とするとBS/CSの番組は比率が狂ってしまいます。
出来れば条件分岐して地デジかBSか判断できれば良いのですが、今のところできてないです←できました。
自分はBSよりも地デジが多いのでBSは手動でやろうかなと思っています。



DGindex処理開始

%DGindex%  ^
-IF=[%~1] ^
-OF=[%save%%name%] ^
-AT=[%template%] ^
-EXIT
続いてDGindex処理内容です。構文としては、
DGindex.exe -IF=[入力ファイル] -OF=[264出力]  -OF=[aac出力] -AT=[template.avs入力]
DGindex.exe -IF=[入力ファイル] -OF=[出力場所]   -AT=[template.avs入力]
と言う感じになっています。ちなみに"  ^ "はキャレットと良い、改行しても一行として扱われます。
オプションについてはDGindexを解凍したファイルにhtmlファイルが詳しいです。


入力AVSファイル 
echo 入力:%output_avs%
ここは読み込んだavsのパスが表示させれるだけです。消してもおk

QSVEncC

%avs2pipemod_path% -y4mp %output_avs% | %QSVEncC_path% %qsv%
QSVEncCはそのままでは動作せず、avs2pipemodを使ってavsをQSVEncCに渡してやる必要があります。
構文としては以下の用な感じ。
avs2pipemod.exe <オプション> <入力avs> | QSVEncC.exe <エンコード設定>

DGindex抽出aac確定
for /f "usebackq tokens=*" %%a in (`dir /B %save%%name%*ms.aac`) ^
do @set output_DGaac="%save%%%a"
echo %output_DGaac%
ネーミングがあれなのはほっといて下さい。
これはDGindexで抽出したaacのフルパスを指定の変数に入れるコマンドです。
これは次のFAWの工程で必要になってきます。

コマンドプロンプトでコマンドの実行結果を直接変数に代入する方法 - 半熟メモ
for /f "usebackq tokens=*" %%a in (`hostname`) do @set x=%%a
コマンド結果を変数に入れる一つの方法で、バッククォーテーションで挟まれたコマンド結果が変数に入ります。
上の例だとホスト名が変数xに入る事になります。

dir /B %save%%name%*ms.aac
「dir」コマンドはディレクトリ中のファイルとサブディレクトリの一覧を表示します。
基本的に入力したTSファイル名を含むaacはひとつなのでそれが変数に設定されます。
Windowsコマンド集:(dir)


FAW偽装→解除
%fawcl_path% %output_DGaac% %output_wav%
%fawcl_path% %output_wav% %output_aac%
FAWは主にaacをwavに偽装し無劣化で編集しaacに戻すときに使います。

今回はDGindexで抽出されたaacを偽装wav化してすぐ元に戻しています。一見無意味そうですが、
偽装wav化する事により元のaacにあるDELAY値分自動的にディレイカットして音がズレないようにします。
avs2wavでもできますが普通にwavに変換するので劣化してしまいます。

前の工程でわざわざDGindexで出したaacのパスを変数に入れたのは、
このFAWがなぜかワイルドカードを読み込んでくれない為です。

mp4boxで結合
%mp4box_path% -fps 29.970 -add %output_264% -add %output_aac% -new %output_mp4%
後はできた264ファイルとaacファイルを合成し、mp4して完成です。構文は以下な感じ。
mp4box.exe -add <作った264のパス> -add <作ったaac> -new<mp4の保存場所>
途中で「-fps 29.970」が入っていますが、入れていないとなぜかフレームレートが狂うので指定しておきます。

残骸ファイル削除
del /f /q %output_DGaac%
del /f /q %output_avs%
del /f /q %output_d2v%
del /f /q %output_264%
del /f /q %output_wav%
del /f /q %output_aac%
echo.

echo 削除ファイル:
if not exist %output_DGaac% echo %output_DGaac%
if not exist %output_avs% echo %output_avs%
if not exist %output_d2v% echo %output_d2v%
if not exist %output_264% echo %output_264%
if not exist %output_wav% echo %output_wav%
if not exist %output_aac% echo %output_aac%
echo.
その名の通り残骸ファイルの削除を行います。
mp4が完成したらavsやd2vは不要なので削除し、削除したものはechoで表示するようにしています。


【追記 7/3】
2013春季アニメを今回の方法でエンコードして来ましたが、殆ど問題無く実行できているように思います。
いままではmp4作成後にもTSを保持していましたが、mp4作成後に元TSをゴミ箱に移動するようにしました。
変更箇所は上のbatファイルにある赤文字の3箇所です。まぁ必ずやる必要はないです。
・set GB="C:\avisynth\program\GB.exe"
・if exist %output_mp4% %GB% %~1
・if not exist %~1 echo %~1
通常の削除ではなく、ゴミ箱に移動しているのは、エンコード失敗した時のためです。
ただ、実はゴミ箱に移動するというコマンドはなく、普通なら削除コマンドしか無いので、

コマンドラインごみ箱ツール
を使います。そのままファイルをゴミ箱に入れるコマンドを付与するソフトです。
gb.exe ファイル名
で指定したファイルがゴミ箱に移動します。

赤文字の一番上はそのGB.exeの保存場所を変数設定ですね。

二番目は、「もし、%output_mp4%が存在するならば、%~1を削除する」と言う意味になります。
%output_mp4%はエンコード完了したmp4ファイル、
%~1はバッチパラメータで、単純に読み込んだ元TSファイルのことです。

最後は、「もし、%~1が存在しないならば、%~1を表示する」
これは削除したかどうかのメッセージを表示するためだけのものです。

GB.exeでなくても、開いてるドライブにフォルダ作ってmp4作成後そこにmoveしておき、
1クールごとに整理するのも良いかと思います。
以上追記でした。



テストエンコードする
batファイルの説明はひと通り終わりました。これでエンコードはできるはずです。
青文字の部分など正しく設定してることを確認した後、試しにTSファイルをbatファイルにD&Dしてみてください。
おそらくは正常にmp4が書き出されると思います。

もしエラーが起きている場合は、batファイルの一番下に”pause”コマンドを入れてみてください。
pauseを入れると自動的にウィンドウが閉じませんので、エラーとなっている所がわかります。
エラーの原因は大抵ファイル名で、DGindexやQSVEncなどの部分で止まっているのかと思います。
使用可能な文字使用不可な文字
文字説明文字説明
()「」『』【】全角括弧  半角/全角スペース
_アンダーバー()[]<>半角括弧
.ピリオド,コンマ
#$%&全角シャープとか#$%&半角シャープとか
全角イコール=半角イコール
!!?感嘆・疑問符(半角疑問符以外)
~'。、;:¥→♪その他のみなさん
こうして見ると、全角であれば結構使えるみたいです。

あと、元ソースと出力されるすべてのファイルはパスは同一であった方が良いです。
自分は一時的に録画ファイルを置いておくフォルダを用意していているのですが、
ちょうどそこでエンコードを今はするようにしています。

因み、TVRockの後処理で使う場合には”pause”コマンドは削除してください。
削除しないとそこで処理が停止し、処理が終わらなくなってしまいます。


連続エンコードする
上に書いたbatファイルでは、複数のTSファイルをD&Dする事はできません。
手動で一括エンコードしたいときには不便ですのでその為の外枠的なbatファイルを作ります。
ファイル名は「roop.bat」としてC直下のavisynthフォルダにでも置いておきます。
@echo off
rem            エラーメッセージ
rem
****************************************************************
set error=ファイルが存在しないか、ファイル名・拡張子が間違っています
if not exist "%1" echo %error%
if not exist "%1" pause
rem ****************************************************************

echo ****************************************************************
echo               エンコード順序                       
echo ****************************************************************
if exist %1 echo   1st:%1
if exist %2 echo   2nd:%2
if exist %3 echo   3rd:%3
if exist %4 echo   4th:%4
if exist %5 echo   5th:%5
echo.

:loop
if not exist "%1" goto end
echo ****************************************************************
echo             BATファイル読込み %time%                    
echo ****************************************************************
echo.
call "QSVEncC.batのフルパス" "%1"
echo.
echo.
echo ****************************************************************
echo End %~n1 %time%
echo.
echo.

shift
goto loop
:end

以前書いたものとほぼ同じです。詳しい説明は下記リンク参照。
Avisynth+バッチファイル+αで簡単にアニメ高速エンコード その3 Firefoxは情弱のたしなみ

青い所にQSVEncC.batのフルパスをいれるだけです。
簡単に説明すると%1を読み込みエンコードが終わったら%2へと進み、
読み込んだファイルが無くなったらループ終了するようになっています。

エンコード順序は今これをエンコードをしていますよ、っていうだけです。
これだと5個目までのファイルしか表示されないのでちょっと何とかしたいと思わなくもないです。

追記【7/3】
作業しながら前に録ったものをエンコードしてるのですが、いつの間にか終わってるので、
なにか作業終了をお知らせする方法がないか調べていたら良い方法が有りました。

batファイルでメッセージを出す方法 - Super Neurotic Junction

batでは普通ポップアップは出せないのですが、何かvbsを通して出せる様になってるみたいです。
自分は、
echo msgbox "エンコードが終了しました",vbCritical,"お知らせ" > %TEMP%/msgboxtest.vbs & %TEMP%/msgboxtest.vbs
を、上のroop.batの一番最後の行に入れています。
以上2度めの追記でした




今回はここまでです。
次回はTVRockあたりについて記事を書こうと思います。
QSVEncC+avisynthで高速自動エンコードする その3
関連記事
スポンサーリンク

| エンコード | 23:00 | comments:16 | trackbacks:0 | TOP↑

QSVとavisynthを使ったエンコード大変参考になりました。今まで手作業でやっていたものがバッチ処理で一発OK、しかもQSVで爆速なのは感動しました。ありがとうございます。
しかし導入で苦労しまして、DGIndexの処理の部分なんですが、そのままだとavsファイルが出力されずエンコードできませんでした。そこでバッチ初心者ながらググったりして頑張ってみたところ、
%DGindex% ^
-IF=[%~1] ^
-OF=[%save%%name%] ^
-AT=[template.avs] ^
-EXIT
に変更したらうまくいきました。理由はよくわかりませんが、同じように苦労されてる方がいたらと思い書き込ませて頂きました。

| 初心者 | 2013/05/02 03:18 | URL |

確認したら「-OF」は一つでも良かったですね。情報ありがとうございます。
なぜ2つ書いたのか不明です…しかし、-OFが2つでも自分の所では機能していたので、
おそらくtemplate.avsの変数設定がエラーの原因かな?と思います。

ともかく成功したようなので良かったです。お疲れ様でした。

| 管理人 | 2013/05/03 23:50 | URL | ≫ EDIT

SCRenameのReadmeに記載の通り
「@YY@MM@DD@SH@SM_@TT_@CH」
のどこかに半角のスペースをいれないと、
全角のスペースを含むファイル名の場合にバッチ処理できないですよ。

| | 2013/05/12 01:52 | URL |

自分のだと半角スペースが存在するとエラーなのですが、
最新のモノでやってみると確かに半角スペース有りでも読み込まれますし、
それがある場合全角スペースがファイル名に有っても正常にリネームされますね。
多分古いバージョンのを使っていたからなのかなと思います。

情報ありがとうございました。

| 管理人 | 2013/05/13 19:08 | URL | ≫ EDIT

https://www.dropbox.com/s/dijvyzuo2zfa8vm/Baidu%20IME_2013-5-18_0-30-20.jpg?v=0rw-
QSvencCのところでこの状態になり、エンコードができません
解決策を教えていただけると嬉しいです

| 超初心者 | 2013/05/18 00:33 | URL | ≫ EDIT

超初心者さんへ

「avs files return value is not a clip」と言うエラーが出てますか。
基本的にネットで見つけたスクリプトを寄せ集めで使ってるので、
自分もavisynthに詳しくはなくエラーの意味が良くわかりませんが、
avsファイルが何かおかしいのかなと思います。

気になる所といえば、
生成したavsにある「DelayAudio("-0.368")」の部分です。
自分の所では数値をダブルクォーテーションでくくっていないので、
「DelayAudio(-0.368)」とすればエラーがでないかもしれません。
template.avsの内容も確認して下さい。

尚、現在自分は公式の「Avisynth_258.exe」を使っています。

もし駄目なのであれば、自分はお手上げなので、wikiやavisynthスレを覗いたり調べてみて下さい。

| 管理人 | 2013/05/18 16:29 | URL | ≫ EDIT

指摘していただいたところの修正と、avsの一行目を削除することにより動作しました
ありがとうございました

| 超初心者 | 2013/05/19 00:41 | URL | ≫ EDIT

超初心者さんへ

あぁ!一行目も問題でしたか。
多分MT.dllとavisynth.dllのインストールができてないのだと思います。

MT.dllはavisynthのpluginフォルダへ

avisynth.dll(MT対応修正版)については、
win7x64なら"C:\Windows\SysWOW64"、XPなら"C:\WINDOWS\system32"の中に
avisynth.dllがあるので、まず入っていたのを『avisynth.dll.bak』とバックアップしておいてから、
ダウンロードしたavisynth.dllに置き換えてください。

勿論SetMTMode(2,0)が無くても、正常に機能はしますが、
マルチスレッドの方がエンコード速度が上がって良いと思います。

ともあれ原因がわかってよかったです。それでは~

| 管理人 | 2013/05/19 10:38 | URL | ≫ EDIT

avsの出力

他の方は上手く行っているようですので、私の環境依存かも知れませんが、avsファイルが出力されませんでした。
調べたところ、template.avsがDGindexに渡っていないようで、

set template="C:\avisynth\template.avs"

set template=C:\avisynth\template.avs

としたら正常にavsが出力され、最後までバッチが完走しました。

情報まで

| neco | 2013/06/16 22:41 | URL |

もう一つありました。
mp4boxは半角#を含むパスが入力できないようです。
これは#を含まないパスで処理するしかないですかね。

| neco | 2013/06/16 22:56 | URL |

necoさんへ

自分の方のbatファイル見てみたらダブルクォーテーションつけてなかったです。
すみません、ダブルクォーテーションは無いほうが正しいです。
情報ありがとうございました。訂正しておきますm(__)m

上の「テストエンコードする」の方にDGindex・bat・mp4boxなどで区別はしていませんが、
最後までエンコードが完了使用出来る・出来ない文字を載せてあります。

個人的には出来ない文字は入れないようにしていますが、
半角の#であれば全角#にリネームしていただければ問題なくエンコード出来ると思います。
リネームソフトは色々ありますが、自分はFlexible Renamerを使っています。

| 管理人 | 2013/06/17 21:33 | URL | ≫ EDIT

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

| | 2013/07/29 10:15 | |

QSVEncC

大変興味深い情報ありがとうございます。
早速自分の環境でも試したのですが
QSVEncC部分の処理で止まってしまうようです。

記事に書かれている下記【1】の記載だと -u quality が
「Error: Unknown value for quality」と出てしまい通らないため、
【2】に変更したのですがエラ-は出なくなったものの
処理が止まってしまいます。

【1】
 set qsv=--y4m -u quality --cqp 24:26:27 --gop-len 300 --bframes 3 --sar 4:3 -i - -o %output_264%

【2】
 set qsv=--y4m -u balanced --cqp 24:26:27 --gop-len 300 --bframes 3 --sar 4:3 -i - -o %output_264%

バージョンは下記のとおりです。

Windows7 Pro 64bit
Avisynth 2.5.8
QSVEnc 1.09
avs2pipemod 0.4.2m

何か心当たりはありますでしょうか?

| pome | 2013/08/29 16:05 | URL | ≫ EDIT

pomeさんへ

正直な所そのエラーが出た事が無いので何が原因かわかりません。

スペックが書いてありますが、
QSV動作要件を満たしているのか気になります。

とりあえずAviutl用のQSVを試していなかったら、
まずそちらでエンコードしてみて下さい。
http://higitune.blog106.fc2.com/blog-entry-93.html

あと、宜しければ作成したQSVEncC.batとavsのスクリプトを、
zipで格納したものを何処かにアップロードし、
非公開コメントで良いのでアップしたURLを貼って見せてください。
なにか分かるかもしれません。

| 管理人 | 2013/08/31 09:30 | URL | ≫ EDIT

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

| | 2013/09/02 14:46 | |

pomeさんへ

自分のと比べてみてもbatに問題がなかったです。
バージョンの違いかと思いQSVEnc 1.09を試してみたところ、
自分も同じようなエラーが出ました。

で、自分の使ってるQSVEncCが出始めの頃のQSVEnc_0.19v2なので、
そちらを使ってみて下さい。そのままで多分できると思います。
https://skydrive.live.com/?cid=6bdd4375ac8933c6&id=6BDD4375AC8933C6!482#cid=6BDD4375AC8933C6&id=6BDD4375AC8933C6!227


うーんとなると最新版だとエンコード設定やpipeの部分が駄目なのか…
と、思いつつもう一度試してみると出来ました。「-u balanced」の部分を下記に変更。

--quality <string>

やはり問題部分は品質設定の部分で、上記の<string>を下記のどれかにして下さい
best, higher, high, balanced(default), fast, faster, fastest

-u qualityにしてくださいとオプションの説明書にありますが、
どうやら使えないみたいです。

| 管理人 | 2013/09/03 21:56 | URL | ≫ EDIT















非公開コメント

http://higitune.blog106.fc2.com/tb.php/100-74e733ad

PREV | PAGE-SELECT | NEXT