EBCDで録画後、動画を自動エンコードするバッチ
★★新しい記事
EBCDで録画後、局ロゴ消して、CMカットして、GPU Encするバッチ(爆速全自動)
があります。★★
人によっては、こちらのほうがより幸せになれます。
これはなに?
EDCBで録画後、番組によって処理パラメーターを変えたい。
「保存用に神画質設定で!」「携帯で持ち出す用」「リネームしたい」「副音声・・・」
そんな個別設定が簡単にできるようになるもの。
自動処理でホニョホニョするにはBAT用意するけど、
細かいパラメータ毎にBATが増殖するのが気持ち悪くってひとまとめにしたん。
方針と解
- EDCB終了後の自動エンコードで、番組ごとにパラメータを切り替えたい。
処理パラメータ(サイズ設定とかフィルタ処理とかリネームとかシャットダウンとか)を
映像ファイルごとに切り替えたい。
EDCBからBAT呼ぶときに引数付けてホニョホニョしよう!
→EDCBでは引数が渡せない仕様だった。呼べるのは、hoge.bat "ファイル名" だけっぽい・・・
違うパラメータ設定ごとに実行用BATが増えるのはスマートじゃない(気がした)ので、ラッパ用のBATファイルを使って設定パラメータを受け渡すことにする。 - せっかくだから、携帯動画変換君ライクにD&Dした映像ファイルも処理したい。
映像ファイルのD&D時には、設定GUI(?) で処理パラメータを変更できるようにする。
処理の流れ
- EDCBから呼ばれたのか、ファイルのD&Dで起動したのか判断、D&Dなら手動パラメータ設定の画面を出す。
- Tssplitする。
- BonDemuxする。副音声があったら別に切り出す。
- NeroEncで音声をエンコードする。
- FFmpegで映像をエンコードして、作ってあった音声をMUXする。
- FFmpegで映像をエンコードして、オリジナルの音声をMUXする。
- リネームしたり、シャットダウンしたりの終了処理をする。
切ったり貼ったりエンコードや遅延処理してたけど、オリジナル音声をそのまま使えば手順3~5が必要なくなってスッキリ。
- 音声を無変換でぶち込めば、なんも考えずに5.1CH音声になることに気がついた。
- 音声データなんて映像に比べるとサイズ小さいし、作業時間短い方がいいや。
- エンコードでの音声劣化も避けられるし。
- Sendtoにこのバッチのショートカットを突っ込んでおくと、動画をまとめて送って一括処理できるので幸せ。
準備
- 実行ファイルをまとめて入れる適当なディレクトリ(実行ディレクトリ)を作成し、必要な実行ファイルを保存する。
ディレクトリ名は半角にし、なるべく浅い場所に作成すると余計なトラブルが少ない。 - Encode.bat の2行目を作業対象の動画ファイルがあるディレクトリに合わせて修正。
- enc_xxxxx.bat の最終行を(1)で作成した実行ディレクトリに合わせて修正。
- enc_xxxxx.bat を必要な数コピーしてリネームし、set exeparam= の引数を修正。
必要な実行ファイル一覧
File | Note |
Encode.bat | (本エントリに添付) BAT本体。2行目は環境に合わせて修正する。 |
DelSpace.vbs | (本エントリに添付) 引数となるファイル名によってはBATが動かない(MSのバグ)対応。 |
enc_1280x720_1.bat | (本エントリに添付) EDCBで起動するラッパファイル ※ 別設定でエンコードしたいときは、コピーして中身を編集 |
FFmpeg.exe ffpresetファイル |
必須。 プリセットファイルを使うならお好みで作成。Encode.bat要修正 ※ Encode.bat で if %pram4%== の記載行に対し -fpre 以降を削除や修正。 |
SCRename一式 | SCRenameによるファイル名変更を行うなら入れとく。 |
TsSplitter.exe | TsSplitによるCMカットを行うなら入れとく。 |
BonTsDemux.exe | neroAacEncを使うなら入れとく。 |
neroAacEnc.exe | neroAacEncで音声を処理するなら入れとく。 |
MP4Box.exe | 副音声をごそごそMUXするなら入れとく。(←にはBonTsDemux,neroAacEncも使う) |
使い方
- EDCBから呼び出す場合
EDCBの録画後実行Batに、好みのパラメータを記載した enc_xxxxx.bat を指定。
例:コード欄に貼ったサンプル enc_xxxxx.bat 記載の 「exeparm=000020000」は、
1280x720,16:9,crf22,H265,音声コピー,tssplit実行,リネーム実行,シャットダウンしない
の設定でエンコードされる。
(Encode.bat 単独起動すると設定パラメータ一覧が表示される。) - 手動D&Dでエンコード実行する場合(携帯動画変換君ライク)
作業対象の動画を、Encode.batにD&Dし、その後パラメータを入力して実行。
パラメータが入力されない部分は、デフォルトの「0」となる。
- D&D後Enterのみ入力すれば「00000000」と解釈。
- 「0002」と入力すれば、「00020000」と解釈。
複数ファイルをまとめてD&Dして一括実行できるが、パラメータはD&D毎に固定。
SendToフォルダにこのバッチのショートカットを突っ込んでおいて、動画を複数選択→右クリックして[送る]から選べばラクラク複数ファイル処理。
Code
Codeの使い方
- 内容をコピペしたテキストファイルを作成し、ファイル名を表題と同じに修正。
- Encode.bat は2行目を修正する
- enc_1280x720.bat は最終行を修正、ファイルコピーしてexepram=の引数を好みで修正する
Encode.Bat
@echo off set VideoPath="D:\Video\" :: 動画ファイルを保存するディレクトリに合わせて設定する。 %~d1 cd %~dp1 set EXEPATH=%~dp0 ::/* 起動元が EDCB or D&D(マニュアル起動) を判別しEDCBから呼ばれていたらパラメ設定をスキップ。 if %EDCB%1==11 ( ping localhost -n 5 >nul: goto START ) else set EDCB=0 ::/* D&D モード時のパラメータを設定 :MENU cls echo echo 処理を選択して下さい。(1~8桁の数字で入力、省略した桁は0がデフォルト) echo ----------------------------------------------------------------------------------------------- echo ┃1st digit ┃2nd ┃3rd ┃4th ┃5th ┃6th ┃7th ┃8th echo ┃ピクセル ┃aspect┃画質 ┃フィルタ ┃Audio処理 ┃自動カット ┃ ┃ echo --------------------------------------------┃------------------------------------------------- echo 0┃1280 x 720┃16:9 ┃crf 22┃de-interlace┃copy ┃Tssplit実行┃リネーム実施┃通常終了 echo 1│ 720 x 480│ 4:3 │crf 20│インタレ保持│neroAacEnc│Tssplit無し│リネーム無し│Shutdown echo 2┃ 854 x 480┃ ┃crf 24┃H265,de-int ┃副音声MUX ┃ ┃_encを付与 ┃ echo 3│ 640 x 480│ │crf 26│nv264,deint │AudioOnly │ │_oldを作成 │ echo 4┃ 960 x 540┃ ┃crf 28┃nv265,deint ┃ ┃ ┃ ┃ echo 5│ 854 x 480│ │crf 30│ │ │ │ │ echo 6┃ 480 x 270┃ ┃ ┃ ┃ ┃ ┃ ┃ echo 7│1920 x1080│ │ │ │ │ │ │ echo ------------------------------------------------------------------------------------------------ echo * Null-input(Enter only) is set to all 0.(12345678 digit) set /p paramin=Please enter a number from 1~8 digits. : set exeparam=0%paramin%00000000 :START ::/* エンコードパラメータを設定 set CONFIG= set prmchk=NG set /a prm1=%exeparam:~1,1% if %prm1%==0 set prmchk=OK & set CONFIG=-s 1280x720 if %prm1%==1 set prmchk=OK & set CONFIG=-s 720x480 if %prm1%==2 set prmchk=OK & set CONFIG=-s 854x480 if %prm1%==3 set prmchk=OK & set CONFIG=-s 640x480 if %prm1%==4 set prmchk=OK & set CONFIG=-s 960x540 if %prm1%==5 set prmchk=OK & set CONFIG=-s 854x480 if %prm1%==6 set prmchk=OK & set CONFIG=-s 480x270 if %prm1%==7 set prmchk=OK & set CONFIG=-s 1920x1080 if %prmchk%==NG goto MENU else set prmchk=NG set /a prm2=%exeparam:~2,1% if %prm2%==0 set prmchk=OK & set CONFIG=%CONFIG% -aspect 16:9 if %prm2%==1 set prmchk=OK & set CONFIG=%CONFIG% -aspect 4:3 if %prmchk%==NG goto MENU else set prmchk=NG set /a prm3=%exeparam:~3,1% if %prm3%==0 set prmchk=OK & set CONFIG=-crf 22 %CONFIG% if %prm3%==1 set prmchk=OK & set CONFIG=-crf 20 %CONFIG% if %prm3%==2 set prmchk=OK & set CONFIG=-crf 24 %CONFIG% if %prm3%==3 set prmchk=OK & set CONFIG=-crf 26 %CONFIG% if %prm3%==4 set prmchk=OK & set CONFIG=-crf 28 %CONFIG% if %prm3%==5 set prmchk=OK & set CONFIG=-crf 30 %CONFIG% if %prmchk%==NG goto MENU else set prmchk=NG set CONFIG=%CONFIG% -loglevel warning set /a prm4=%exeparam:~4,1% if %prm4%==0 set prmchk=OK & set CONFIG=-vcodec libx264 -vf "yadif=0:-1,pp=dr/fq,hqdn3d" %CONFIG% -fpre %EXEPATH%libx264-64.ffpreset if %prm4%==1 set prmchk=OK & set CONFIG=-vcodec libx264 %CONFIG% -fpre %EXEPATH%libx264-64.ffpreset if %prm4%==2 set prmchk=OK & set CONFIG=-vcodec libx265 -vf "yadif=0:-1,pp=dr/fq,hqdn3d,unsharp" %CONFIG% if %prm4%==3 set prmchk=OK & set CONFIG=-vcodec nvenc_h264 -vf "yadif=0:-1,pp=dr/fq,hqdn3d" %CONFIG% if %prm4%==4 set prmchk=OK & set CONFIG=-vcodec nvenc_h265 -vf "yadif=0:-1,pp=dr/fq,hqdn3d" %CONFIG% if %prmchk%==NG goto MENU else set prmchk=NG set /a prm5=%exeparam:~5,1% set /a prm6=%exeparam:~6,1% if not %~x1==.ts set /a prm6=1 set /a prm7=%exeparam:~7,1% set /a prm8=%exeparam:~8,1% if %prm8%==0 set prmchk=OK & set SHUTD=no if %prm8%==1 set prmchk=OK & set SHUTD=yes if %prmchk%==NG goto MENU else set prmchk=NG ::開始時間取得 set tm=10%time: =% set /a STTIME=1%tm:~-11,2%*3600 + 1%tm:~-8,2%*60 + 1%tm:~-5,2% - 366000 ::ファイル名を求める for /f "usebackq tokens=* delims=" %%K in (`call cscript //nologo %EXEPATH%DelSpace.vbs %1`) DO set FileName=%%K set FilePath=%1 cls echo ****************************************************************************** echo 対象 : %FileName% if %EDCB%==1 set /p dmy=【EDCBバッチモード】<nul if %prm4%==1 set /p dmy=【インタレ保持】<nul & if %prm4%==2 set /p dmy=【H265】<nul if %prm5%==0 set /p dmy=【Audioコピー】<nul & if %prm5%==1 set /p dmy=【neroAacEnc】<nul & if %prm5%==2 set /p dmy=【副音声MUX】<nul & if %prm5%==3 set /p dmy=【mp3作成モード】<nul if %prm6%==0 (set /p dmy=【tssplit実施】<nul) else set /p dmy=【tssplitなし】<nul if %prm7%==0 set /p dmy=【SCRename実施】<nul & if %prm8%==1 (set /p dmy=【終了後シャットダウン】<nul) else set /p dmy=【通常終了】<nul echo 設定 : %CONFIG% echo でエンコードします。 echo ****************************************************************************** set UNQ=%RANDOM% set EncTMP=%UNQ%_EncTMP :CHKFILE setlocal enabledelayedexpansion set LOCKNAME="" if exist %VideoPath%lock.txt ( set /p LOCKNAME=<%VideoPath%lock.txt rem echo !LOCKNAME! を作業中の5分間待ちます。 echo 作業中のファイル「!LOCKNAME!」 echo 2分間待ちます。(%kaisu% 回目) ping localhost -n 110 >nul: ) else goto ENCODE endlocal set /a kaisu=kaisu+1 ping localhost -n 10 >nul: goto START :ENCODE if %prm5%==2 goto METHOD1-SUBMUX if %prm5%==3 goto METHOD1-AudioOnly :------------------------------------------------------------------------------------------------------------- :METHOD1 echo METHOD1 音声トラックコピー echo %FileName%>%VideoPath%lock.txt ren "%FileName%%~x1" %EncTMP%.in if not %prm6%==0 goto JP1 echo ■Tssplit実行... %EXEPATH%TsSplitter.exe -EIT -ECM -EMM -SD -1SEG -SEP2 -SEPA %EncTMP%.in FOR /f "DELIMS=" %%A IN ('dir /b /os %EncTMP%_*') DO SET TGTFILE=%%A if %TGTFILE%=="" set TGTFILE=%EncTMP%.in :JP1 if %prm5%==0 ( echo ■x264圧縮&mp4コンテナ格納中... rem %EXEPATH%ffmpeg -y -analyzeduration 60M -probesize 60M -i "%EncTMP%.in" -acodec copy -absf aac_adtstoasc %CONFIG% "%EncTMP%.mp4" %EXEPATH%ffmpeg -y -i "%EncTMP%.in" -acodec copy -absf aac_adtstoasc %CONFIG% "%EncTMP%.mp4" goto CLOSING ) ::/* Neroエンコーダ使用 (2ch) echo ■Demux実行中... %EXEPATH%BonTsDemux.exe -i -nd "%TGTFILE%" -o "%EncTMP%" -encode Demux(m2v+wav) -nogui -sound 1 -start -quit echo ■AACファイル作成... %EXEPATH%neroAacEnc.exe -if "%EncTMP%.wav" -lc -br 128000 -of "%EncTMP%.aac" echo ■x264圧縮&mp4コンテナ格納中... %EXEPATH%ffmpeg -y -i "%EncTMP%.aac" -i "%EncTMP%.m2v" -acodec copy %CONFIG% "%EncTMP%.mp4" goto CLOSING ) ::------------------------------------------------------------------------------------------------------------- :METHOD1-SUBMUX if %~x1 neq .ts ( echo 入力ファイルがTSファイルではありません。 goto GONEXT ) echo %FileName%>%VideoPath%lock.txt ren "%FileName%%~x1" %EncTMP%.in echo ■Tssplit実行... %EXEPATH%TsSplitter.exe -EIT -ECM -EMM -SD -1SEG -SEP2 -SEPA %EncTMP%.in FOR /f "DELIMS=" %%A IN ('dir /b /os %EncTMP%_*') DO SET TGTFILE=%%A if %TGTFILE%=="" set TGTFILE=%EncTMP%.in echo ■副音声Demux実行中... %EXEPATH%BonTsDemux.exe -i -nd "%TGTFILE%" -o "%EncTMP%_sub" -encode Demux(wav) -nogui -sound 2 -es 1 -start -quit echo ■副音声AACファイル作成... %EXEPATH%neroAacEnc.exe -if "%EncTMP%_sub.wav" -lc -br 128000 -of "%EncTMP%_sub.aac" echo ■Demux実行中... %EXEPATH%BonTsDemux.exe -i -nd "%TGTFILE%" -o "%EncTMP%" -encode Demux(m2v+wav) -nogui -sound 1 -start -quit echo ■AACファイル作成... %EXEPATH%neroAacEnc.exe -if "%EncTMP%.wav" -lc -br 128000 -of "%EncTMP%.aac" echo ■x264圧縮&mp4コンテナ格納中... %EXEPATH%ffmpeg -y -i "%EncTMP%.m2v" %CONFIG% "%EncTMP%_main.mp4" echo ■映像/音声 MUX中... %EXEPATH%MP4Box.exe -add "%EncTMP%_main.mp4"#video:group=1 -add "%EncTMP%.aac"#audio:group=1 -add "%EncTMP%_sub.aac"#audio:disable:group=1 -new "%EncTMP%.mp4" goto CLOSING ::-------------------------------------------------------------------------------------------------------------- :METHOD1-AudioOnly echo ■mp3作成中... %EXEPATH%ffmpeg -y -i "%EncTMP%.in" -acodec copy -absf aac_adtstoasc "%EncTMP%.mp3" goto CLOSING :: ================================================================================================================== :CLOSING echo %FileName% のエンコードを終了しました。 set tm=10%time: =% set /a EXETIME=1%tm:~-11,2%*3600 + 1%tm:~-8,2%*60 + 1%tm:~-5,2% - 366000 -%STTIME% if 0 gtr %EXETIME% set /a EXETIME=86400%EXETIME% set /a min=%EXETIME%/60 set /a sec=%EXETIME%-%min%*60 set min=00%min% set sec=0%sec% echo 処理時間は、%min:~-3%分 %sec:~-2%秒 でした。 echo . set /p LOCKNAME=<%VideoPath%lock.txt ren %VideoPath%Encodelog.txt Encodelog echo %date:~-8% %time:~0,5% %min:~-3%m%sec:~-2%s %exeparam:~1,8% %LOCKNAME% > "%VideoPath%Encodelog.txt" type "%VideoPath%Encodelog" >> "%VideoPath%Encodelog.txt" del %VideoPath%Encodelog copy %VideoPath%Encodelog.txt %EXEPATH%Encodelog.txt ren "%EncTMP%.in" "%FileName%%~x1" if %prm7%==2 ( ren "%EncTMP%.mp4" "%FileName%_enc.mp4" ) if %prm7%==3 ( ren "%FileName%.mp4" "%FileName%_old.mp4" ren "%EncTMP%.mp4" "%FileName%.mp4" ) if exist "%FileName%.mp4" ( ren "%EncTMP%.mp4" "%FileName%_%UNQ%.mp4" ) ELSE ren "%EncTMP%.mp4" "%FileName%.mp4" if "%ERRORLEVEL%"=="0" del "%EncTMP%*" if %prm7%==0 ( call %EXEPATH%SCRename.bat "%FileName%%~x1" call %EXEPATH%SCRename.bat "%FileName%.mp4" ) :GONEXT del %VideoPath%lock.txt if %EDCB%==1 goto TERMINATION shift if /i "1%~1" EQU "1" goto TERMINATION ping localhost -n 5 >nul: goto START :TERMINATION echo 処理を終了します。 if %SHUTD%==yes shutdown /s /t 240 if %EDCB%==0 pause else ping localhost -n 20 >nul: endlocal
- TSファイル以外をtsspilit対象にした場合異常終了していたのを修正。
DelSpace.vbs
Option explicit Dim INFile,splName,intIndex,FilePath,FileName,Count,i Dim fso ' Dim Count As Integer set fso = createobject("scripting.filesystemobject") set INFile = WScript.Arguments splName = Split(INFile(0), "\") count = UBound(splName) For i = 0 To count -1 FilePath = FilePath + splName(i) + "\" Next splName(count) = Replace(splName(count), " ", "_") splName(count) = Replace(splName(count), "!", "") splName(count) = Replace(splName(count), "!", "") If not fso.fileExists(Filepath + splName(count)) then fso.getfile(INFile(0)).name = splName(count) End If FilePath = Join(splName, "\") WScript.Echo fso.GetBaseName(FilePath) set fso = nothing set INFile = nothing set splName = nothing set intIndex = nothing set count = nothing ' set FilePath = nothing ' set FileName = nothing WScript.Quit ' FileName 対象ファイル名 aaaaaaa_01 ' FilePath 対象ファイルのフルパス "D:\dir\aaaaaaa_01.txt"
enc_1280x720.bat(サンプル)
ping localhost -n 20 >nul: :: 0┃1280 x 720┃16:9 ┃crf 22┃de-interlace┃copy ┃Tssplit実行┃リネーム実施┃通常終了 :: 1│ 720 x 480│ 4:3 │crf 20│インタレ保持│neroAacEnc│Tssplit無し│リネーム無し│Shutdown :: 2┃ 854 x 480┃ ┃crf 24┃H265,de-int ┃副音声MUX ┃ ┃_encを付与 ┃ :: 3│ 640 x 480│ │crf 26│nv264,deint │AudioOnly │ │_oldを作成 │ :: 4┃ 960 x 540┃ ┃crf 28┃nv265,deint ┃ ┃ ┃ ┃ :: 5│ 854 x 480│ │crf 30│ │ │ │ │ :: 6┃ 480 x 270┃ ┃ ┃ ┃ ┃ ┃ ┃ :: 7│1920 x1080│ │ │ │ │ │ │ :: ↓1桁目には0をつける。実際のパラメータは2桁目から記載 :: 012345678 set exeparam=000020000 set EDCB=1 call "D:\DigitalTV\Encode\encode.bat" "$FilePath$"
休日の勢いで作ったけど、なんとなく動いてるから雛形はこれで完成。
エンコーダをQSVEncとかNVENCにしてみるとか、いろいろ試したいとこはあるけどまた今度。