EBCDで録画後、局ロゴ消して、CMカットして、GPU Encするバッチ(爆速全自動)
世の中には賢い人が居るもので。
Webをさまよってたら、自動で局ロゴを消す試行環境を提供してくれてる人が居た。
そしてその環境を使って、録画後処理を自動化までできてた。
それをそのままパク・・参考にさせていただき、自分の環境(*)に合わせた記録。
30分番組の、ロゴ消し→CMカット→フィルターかけてエンコードが5~10分で終了します。
いままで1時間以上かかってたのにね。
以下、環境作成手順の記録。
*といってもただのバッチ。EDCBから起動するときFullHDでとか264でとか265でとかフィルタ強めでとか好きな設定で起動できて、ついでに動画ファイルをD&Dしたら携帯動画変換君みたいに使えるっていうような、二刀流にしたやつ。
AviSynth+の環境を作る。
※AviSynthは、元の動画ファイルには手を加えずリアルタイムで加工し、
動画再生や動画編集のプログラムに渡すことができる優れものアプリ。
リサイズとかノイズ消しとか輪郭調整とかいろんな事ができる。
コーデック別途必要なので、ffdshowとかK-Lite Codecとか好きなやつ導入必須。
- 本体はここからPlusの64Bit版インストーラをもらってきてインストールするだけ。
MT(Multi-Threading)版でも良いと思うけどまだ試してない。 - AviSynthに必要なPluginを設定する。必要なDLLを↓に保存するだけ。
C:\Program Files (x86)\AviSynth+\plugins64+ (標準インストールの場合)
必要なDLLは以下(だと思う・・・)
・delogo.dll delogo_avs+.zip x64フォルダの中にある
・LSMASHSource.dll L-SMASH_Works_r935_plugins.zip x64フォルダの中にある。
JoinLogoの環境を作る。
- オタクの徒然日記のページを敬意を払いながら熟読し、以下 Part xxの環境を構築します。
ページ内でdataと記載してある部分は、toolと読み替えて作業します。
Part2
Part3 (x264、L-smash worksについては↑のDLLを導入してるから必要なし)
Part4 (mp4box は64bit版を使用)
Part6 (マクロは $ServiceName$ $Title2$.ts とする。スペースは絶対半角!)
join_logo_scpの更新
NVEncCを導入する。
- rigayaの日記兼メモ帳のページを敬意を払いながら熟読し、NVEncCのバイナリを頂く。
toolのフォルダに配置する。
環境構築後のフォルダ構成はこんな感じになってます。
(Avisynthのプラグインはいろいろ盛りすぎてどれがどれか行方不明に・・・
バッチファイル(今回手直したもの)を導入する。
- 以下のCodeをコピペしたテキストファイルを作成し、ファイル名を Encode.bat に修正する。
- if %prm....行末のNVEncCパラメータは各自お好きな内容に変更してください。
Encode.Bat
@echo off ::/* カレントフォルダを移動、変数を設定 cd /d %~dp1 set VideoPath=%~dp1 set EXEPATH=%~dp0 set tspa_ex=%~dp0tool\MPEG-API_Utilsx86\ts_parser.exe set jnls_ex=%~dp0tool\join_logo_scp試行環境\jlse_bat.bat set jnlg_rl=%~dp0tool\join_logo_scp試行環境\result set LDat_dr=%~dp0tool\join_logo_scp試行環境\logo set fawc_ex=%~dp0tool\FAW\fawcl.exe set NVEn_ex=%~dp0tool\NVEncC\x64\NVEncC64.exe set aace_ex=%~dp0tool\aacedit\aacedit2.exe set mp4b_ex=%~dp0tool\mp4box64\mp4box.exe set muxr_ex=%~dp0tool\muxer.exe set tled_ex=%~dp0tool\timelineeditor.exe set scrn_bt=%~dp0tool\ScRename\SCRename.bat ::/* EDCBから起動された場合はパラメータ手入力をスキップ if %EDCB%1==11 ( ping localhost -n 5 >nul: goto PRM_CONFIG ) 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┃ 画質 ┃ノイズ除去┃ UnSharp ┃ 輪郭強調 ┃ ぼかし ┃ 終了処理 echo --------------------------------------------┃------------------------------------------------------ echo 0┃ 1280 x 720┃ 16:9 ┃ vbrhq 20k┃ やや強め ┃ 少しだけ ┃ 少しだけ ┃ ガウス3 ┃ 通常終了 echo 1│ 720 x 480│ 4:3 │ cbrhq 18k│ 弱め │ やや強め │ やや強め │ none │ Shutdown echo 2┃ 640 x 360┃ ┃ ┃ none ┃ none ┃ none ┃ ┃ echo 3│ 640 x 480│ │ │ │ │ │ │ echo 4┃ 960 x 540┃ ┃ ┃ ┃ ┃ ┃ ┃ echo 5│ 854 x 480│ │ │ │ │ │ │ echo 6┃ 480 x 720┃ ┃ ┃ ┃ ┃ ┃ ┃ 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 rem https://rigaya34589.blog.fc2.com/blog-entry-722.html rem https://rigaya34589.blog.fc2.com/blog-entry-739.html rem https://github.com/rigaya/NVEnc/blob/master/NVEncC_Options.ja.md#--vpp-afs-param1value1param2value2 :PRM_CONFIG ::/* エンコードパラメータを設定 set NVEn_op=-c hevc --output-depth 10 --profile main10 --preset quality --interlace tff --vpp-afs preset=anime,24fps=true,rff=true,timecode=true --vpp-resize lanczos set prmchk=NG set /a prm1=%exeparam:~1,1% if %prm1%==0 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 1280x720 if %prm1%==1 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 720x480 if %prm1%==2 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 640x360 if %prm1%==3 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 640x480 if %prm1%==4 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 960x540 if %prm1%==5 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 854x480 if %prm1%==6 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 480x720 if %prm1%==7 set prmchk=OK & set NVEn_op=%NVEn_op% --output-res 1920x1080 if %prmchk%==NG goto MENU else set prmchk=NG set /a prm2=%exeparam:~2,1% if %prm2%==0 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm2%==1 set prmchk=OK & set NVEn_op=%NVEn_op% --sar 4:3 if %prmchk%==NG goto MENU else set prmchk=NG set /a prm3=%exeparam:~3,1% if %prm3%==0 set prmchk=OK & set NVEn_op=%NVEn_op% --vbrhq 2000 --qp-init 25:27:29 --qp-min 22:23:24 if %prm3%==1 set prmchk=OK & set NVEn_op=%NVEn_op% --cbrhq 1800 if %prm3%==2 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm3%==3 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm3%==4 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm3%==5 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm3%==6 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm3%==7 set prmchk=OK & set NVEn_op=%NVEn_op% if %prmchk%==NG goto MENU else set prmchk=NG set /a prm4=%exeparam:~4,1% if %prm4%==0 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-knn radius=3,strength=0.10,lerp=0.1 if %prm4%==1 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-knn radius=2,strength=0.05,lerp=0.1 if %prm4%==2 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm4%==3 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm4%==4 set prmchk=OK & set NVEn_op=%NVEn_op% if %prmchk%==NG goto MENU else set prmchk=NG set /a prm5=%exeparam:~5,1% if %prm5%==0 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-unsharp radius=1,weight=0.1,threshold=100 if %prm5%==1 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-unsharp weight=1.0 if %prm5%==2 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm5%==3 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm5%==4 set prmchk=OK & set NVEn_op=%NVEn_op% if %prmchk%==NG goto MENU else set prmchk=NG set /a prm6=%exeparam:~6,1% if %prm6%==0 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-edgelevel strength=5.0,threshold=24.0,black=6.0 if %prm6%==1 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-edgelevel strength=10.0,threshold=16.0,black=0,white=0 if %prm6%==2 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm6%==3 set prmchk=OK & set NVEn_op=%NVEn_op% if %prmchk%==NG goto MENU else set prmchk=NG set /a prm7=%exeparam:~7,1% if %prm7%==0 set prmchk=OK & set NVEn_op=%NVEn_op% --vpp-gauss 3 if %prm7%==1 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm7%==2 set prmchk=OK & set NVEn_op=%NVEn_op% if %prm7%==3 set prmchk=OK & set NVEn_op=%NVEn_op% 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 :CHKFILE setlocal enabledelayedexpansion set LOCKNAME="" if exist %VideoPath%★lock.txt ( set /p LOCKNAME=<%VideoPath%★lock.txt echo 作業中のファイル「!LOCKNAME!」 echo 2分間待ちます。(%kaisu% 回目) ping localhost -n 110 >nul: ) else goto START endlocal set /a kaisu=kaisu+1 ping localhost -n 10 >nul: goto CHKFILE ::/* START---------------------------------------------------------------------------------------------------------------- :START ::/* ファイル名を求める set TitleName=%~n1 set InFile=%~n1%~x1 set FilePath="%~1" echo ■■■■■■■■■■■■■■%InFile%の作業開始 echo ::/* 開始時間取得 set tm=10%time: =% set /a STTIME=1%tm:~-11,2%*3600 + 1%tm:~-8,2%*60 + 1%tm:~-5,2% - 366000 echo ::/* 作業用仮ファイル名に変更 set kyoku= for /f "tokens=1" %%K in ('echo %InFile%') do set kyoku=%%K if "%kyoku%"=="" set kyoku=UN set UNQ=%RANDOM% set EncTMP=%kyoku%_%UNQ%_EncTMP set EncFile=%kyoku%_%UNQ%_EncTMP%~x1 echo %TitleName%>%VideoPath%★lock.txt ren "%InFile%" %EncFile% echo ::/* TS以外のファイルは別処理に回す if not %~x1==.ts goto METHOD2 echo ::/* 音声処理■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ echo ::/* aacを抽出 %tspa_ex% --mode da --rb-size 16384 --wb-size 32768 --delay-type 3 --output %EncTMP% %EncFile% echo ::/* aacのファイルが 2つなら音声多重とする set /a trknum=0 for %%A in (%EncTMP%*.aac) do ( if exist %%A (set /a trknum=trknum+1) ) echo ::/* 音ズレしたaacをFAWで音ズレ補正して、偽装wavに変換 即AAC化 FOR %%F in ("%EncTMP%*.aac") do start "" /b /wait %fawc_ex% -s2 "%%F" & ren "%EncTMP%*.wav" "%EncTMP%.wav" start /b /wait %fawc_ex% "%EncTMP%.wav" "%EncTMP%1.aac" echo ::/* 音声多重用aac処理 if %trknum%==2 FOR %%F in ("%EncTMP%*aac.wav") do start /b /wait %fawc_ex% "%%F" "%EncTMP%2.aac" echo ::/* join_logo_scp試行環境起動■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ if not exist "%jnlg_rl%\" ( mkdir %jnlg_rl% ) call %jnls_ex% "%VideoPath%%EncFile%" echo ::/* NVエンコード→AACカット→映像と音声を合成しMP4化+チャプター追加■■■■■■■■■■■■■ %NVEn_ex% %NVEn_op% -i "%jnlg_rl%\%EncTMP%\in_cutcm_logo.avs" -o "%EncTMP%.h264" timeout /t 3 echo ::/* MUX処理■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ %muxr_ex% -i "%EncTMP%.h264" -o "%EncTMP%_tmp.mp4" %tled_ex% --timecode "%EncTMP%.timecode.txt" --media-timescale 1001 --media-timescale 120000 "%EncTMP%_tmp.mp4" "%EncTMP%_tmp2.mp4" echo ::/* 音声多重の場合は2つaacにtrimを追加してmp4boxへ 通常時は1つだけ処理 if %trknum%==2 ( %aace_ex% -t "%jnlg_rl%\%EncTMP%\obs_cut.avs" -o "%EncTMP%_cut1.aac" "%EncTMP%1.aac" %aace_ex% -t "%jnlg_rl%\%EncTMP%\obs_cut.avs" -o "%EncTMP%_cut2.aac" "%EncTMP%2.aac" %mp4b_ex% -add "%EncTMP%_tmp2.mp4" -add "%EncTMP%_cut1.aac" -add "%EncTMP%_cut2.aac" -chap "%jnlg_rl%\%EncTMP%\obs_chapter_cut.chapter.txt" -new "%EncTMP%.mp4" ) else ( %aace_ex% -t "%jnlg_rl%\%EncTMP%\obs_cut.avs" -o "%EncTMP%_cut1.aac" "%EncTMP%1.aac" %mp4b_ex% -add "%EncTMP%_tmp2.mp4" -add "%EncTMP%_cut1.aac" -chap "%jnlg_rl%\%EncTMP%\obs_chapter_cut.chapter.txt" -new "%EncTMP%.mp4" ) goto CLOSING ::============================================ ::METHOD2--------------------------------------------------------------------------------------------------------------- :METHOD2 :: mkv変換とか音声MUXとかFFMPEGで処理したいときとかのコードが書かれる予定地 :: ここにはまだなにもないよ goto CLOSING ::================================================================================================================== :CLOSING rem ::/* 元の名前に戻す ren "%EncTMP%%~x1" "%TitleName%%~x1" if exist "%TitleName%.mp4" ( ren "%EncTMP%.mp4" "%TitleName%_%UNQ%.mp4" ) ELSE ren "%EncTMP%.mp4" "%TitleName%.mp4" if "%ERRORLEVEL%"=="0" del "%EncTMP%*" rem ::/* エンコードファイルのタイムスタンプを入力ファイルに合わせる for %%w in ("%InFile%") do set wtime=%%~tw powershell -ExecutionPolicy RemoteSigned -Command Set-ItemProperty '%TitleName%.mp4' -name LastWriteTime -value '%wtime%' powershell -ExecutionPolicy RemoteSigned -Command Set-ItemProperty '%TitleName%.mp4' -name CreationTime -value '%wtime%' rem ::/* SCRenameに通す call %scrn_bt% "%TitleName%%~x1" call %scrn_bt% "%TitleName%.mp4" echo %InFile% のエンコードを終了しました。 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%秒 でした。 rem ::/* ログの先頭に追記 echo; ren %VideoPath%Encodelog.txt Encodelog echo %date:~-8% %time:~0,5% %min:~-3%m%sec:~-2%s %exeparam:~1,8% %TitleName% > "%VideoPath%Encodelog.txt" type "%VideoPath%Encodelog" >> "%VideoPath%Encodelog.txt" del %VideoPath%Encodelog copy %VideoPath%Encodelog.txt %EXEPATH%Encodelog.txt :GONEXT del %VideoPath%★lock.txt rd /S /Q "\\?\d:\DigitalTV\Encode\tool\join_logo_scp試行環境\result\" 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 rem ★注意 rem ファイル名に全角スペースのみが入っていると、引数として渡した際にその箇所で区切られる。(MSのバg・・・仕様) rem e.g.「[二][新] ヨルムンガンド・ネクスト」 → 「[二][新]」 rem rem 回避作 ファイル名または保存フォルダに半角スペースを含むと、"" 括りで渡されるので処理可能。 rem ファイル名プラグインに "RecName?Macro.dll" を指定、 rem パラメータを $ServiceName$ $Title2$ $SubTitle2$ .ts とする。 (※このBATでは本設定が必須) rem rem rem ■変数名 ■用途 ■格納値例 rem EDCB EDCBからの起動時に1が渡される 1 rem EXEPATH BATの実行ディレクトリ D:\DigitalTV\Encode\ rem VideoPath 処理対象ファイルのフォルダ D:\Video\ rem XXXX_ex 外部ツールのパス D:\DigitalTV\Encode\tool\FAW\fawcl.exe rem rem InFile 対象ファイル名 TOKYOMX ヨルムンガンド_01.ts rem FilePath 対象ファイルのフルパス "D:\Video\TOKYOMX ヨルムンガンド_01.ts" rem EncTMP 作業用ユニークファイル名 D:\Video\TOKYOMX_20245_EncTMP rem EncFile 作業用ユニークファイル名 D:\Video\TOKYOMX_20245_EncTMP.ts rem rem prm xx 入力されたエンコードパラメータ 1 rem UNQ ユニークファイル名作成用乱数 20245 rem rem ■ラベル rem MENU D&D モード時のパラメータを設定作業開始位置。 rem PRM_CONFIG NVEncの基本パラメータやその他パラメータを設定。EDCBから起動した場合、ここに飛ぶ。 rem CHKFILE 他のファイルをエンコードしてないかチェック、なければ次へ。 rem START エンコードモード作業開始位置 rem METHODxx エンコードモード別のサブルーチン。 rem CLOSING エンコード終了処理。ファイル名復元とテンポラリ削除、ショボイリストからのファイル名取得、実行時間表示、ログ書き込み rem GONEXT 複数ファイルD&Dでの起動時、次のファイル名をセット、STARTに戻ってエンコード再実行。 rem TERMINATION BAT終了処理。シャットダウンフラグによってはシャットダウン実行
D&Dモード実行時のパラメータ設定イメージ
その他
- EDCBからこのバッチを呼ぶラッパバッチが必要です。
EBCDで録画後、動画を自動エンコードするバッチのページを参照してください。
↓は720x480用のサンプルです。最終行は各自環境に合わせます。
このラッパバッチをEDCBから起動し、メインのバッチを起動してもらいます。
ラッパバッチは複数作成し、set exeparam=の後ろを、好きなパラメータに変更することで、EDCB終了後のエンコードパラメータを設定できます。
ping localhost -n 20 >nul: :: -┃[1]---------[2]------[3]---------[4]--------┃[5]--------[6]---------[7]---------[8]------- :: 0┃ 1280 x 720┃ 16:9 ┃ vbrhq 20k┃ やや強め ┃ 少しだけ ┃ 少しだけ ┃ ガウス3 ┃ 通常終了 :: 1│ 720 x 480│ 4:3 │ cbrhq 18k│ 弱め │ やや強め │ やや強め │ none │ Shutdown :: 2┃ 640 x 360┃ ┃ ┃ none ┃ none ┃ none ┃ ┃ :: 3│ 640 x 480│ │ │ │ │ │ │ :: 4┃ 960 x 540┃ ┃ ┃ ┃ ┃ ┃ ┃ :: 5│ 854 x 480│ │ │ │ │ │ │ :: 6┃ 480 x 720┃ ┃ ┃ ┃ ┃ ┃ ┃ :: 7│ 1920 x1080│ 転削除│ │ │ │ │ │ ::-------------------------------------------------------------------------------------------------- :: ↓1桁目には0をつける。実際のパラメータは2桁目から記載 :: 012345678 set exeparam=010000000 set EDCB=1 call "D:\DigitalTV\Encode\encode.bat" "$FilePath$"
- SCRenameの、SCRename.rp1 を自分の環境に合わせて編集します。作成された動画ファイル名の先頭に、$ServiceName$ (局名)が入っているためです。
TOKYOMX ,
の行を追加したり。コレをやらないと、リネームされません。 - SCRenameの、Screname.batは以下のように修正して使っています。
@echo off setlocal set SCRPATH=%~dp0 :LOOP for /F "usebackq delims=" %%I in (`cscript //nologo "%SCRPATH%\SCRename.vbs" "%~1" "$SCtitle$ $SCpart$$SCnumber$ 「$SCsubtitle$」" 1 6`) do set SCRTARGET=%%~I shift if "%~1" NEQ "" goto LOOP endlocal
Avisynth用ロゴファイル
Avisynthに、AviUtlのロゴファイルは使えない、新しく作る必要あり。
【必要なTOOL】
- AvisynthのPlugin64+に、YV12To422-1.0.2.zipから取り出した、YV12To422.dll(x64)を保存
- AviUtlのpluginsに、440_420_filter.aufを保存
- AviUtlのロゴ解析フィルタ
【手順】
- join_logo_scp試行環境で、jlse_bat.batに hoge.tsをドロップ。
Resultフォルダ(なければ作ってから再挑戦)の下にin_cutcm.avs を得る。 - in_cutcm.avsをテキストエディタで開き、AudioDub(last・・・の行の下に↓を追加YV12To422(itype=0,interlaced=true,cplace=0)
- in_cutcm.avsを、Aviutlで開く
- 4:2:0化で縦1 横1 プログレッシブ・オフにしてからロゴ解析する。
- 4:2:0化とロゴ解析、両方の設定ウインドゥを開いておくこと。
その他のプラグインは起動しないこと。 - Aviutlでは解析フレームが多すぎるとメモリ確保エラーとなるので、←→のボタンで作業フレームの範囲を決定してから実行すると幸せ。