おやつはさっき食べたでしょ

書き留めないと忘れちゃう。

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プラグインはいろいろ盛りすぎてどれがどれか行方不明に・・・

f:id:usagi311:20180506212005p:plain f:id:usagi311:20180506211937p:plain f:id:usagi311:20180506212426p:plain

バッチファイル(今回手直したもの)を導入する。

  • 以下の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終了処理。シャットダウンフラグによってはシャットダウン実行

 

f:id:usagi311:20180507210759j:plainD&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】

【手順】

  • 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では解析フレームが多すぎるとメモリ確保エラーとなるので、←→のボタンで作業フレームの範囲を決定してから実行すると幸せ。