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

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

EBCDで録画後、動画を自動エンコードするバッチ

これはなに?

EDCBで録画後、番組によって処理パラメーターを変えたい。
「保存用に神画質設定で!」「携帯で持ち出す用」「リネームしたい」「副音声・・・」
そんな個別設定が簡単にできるようになるもの。

自動処理でホニョホニョするにはBAT用意するけど、
細かいパラメータ毎にBATが増殖するのが気持ち悪くってひとまとめにしたん。

方針と解

  1. EDCB終了後の自動エンコードで、番組ごとにパラメータを切り替えたい。
    処理パラメータ(サイズ設定とかフィルタ処理とかリネームとかシャットダウンとか)を
    映像ファイルごとに切り替えたい。
    EDCBからBAT呼ぶときに引数付けてホニョホニョしよう!
    →EDCBでは引数が渡せない仕様だった。呼べるのは、hoge.bat "ファイル名"  だけっぽい・・・
    違うパラメータ設定ごとに実行用BATが増えるのはスマートじゃない(気がした)ので、ラッパ用のBATファイルを使って設定パラメータを受け渡すことにする。

  2. せっかくだから、携帯動画変換君ライクにD&Dした映像ファイルも処理したい。
    映像ファイルのD&D時には、設定GUI(?) で処理パラメータを変更できるようにする。

f:id:usagi311:20170409135247j:plain

 

処理の流れ

  1. EDCBから呼ばれたのか、ファイルのD&Dで起動したのか判断、D&Dなら手動パラメータ設定の画面を出す。
  2. Tssplitする。
  3. BonDemuxする。副音声があったら別に切り出す。
  4. NeroEncで音声をエンコードする。
  5. FFmpegで映像をエンコードして、作ってあった音声をMUXする。
  6. FFmpegで映像をエンコードして、オリジナルの音声をMUXする。
  7. リネームしたり、シャットダウンしたりの終了処理をする。

切ったり貼ったりエンコードや遅延処理してたけど、オリジナル音声をそのまま使えば手順3~5が必要なくなってスッキリ。

  • 音声を無変換でぶち込めば、なんも考えずに5.1CH音声になることに気がついた。
  • 音声データなんて映像に比べるとサイズ小さいし、作業時間短い方がいいや。
  • エンコードでの音声劣化も避けられるし。
  • Sendtoにこのバッチのショートカットを突っ込んでおくと、動画をまとめて送って一括処理できるので幸せ。

 

準備

  1. 実行ファイルをまとめて入れる適当なディレクトリ(実行ディレクトリ)を作成し、必要な実行ファイルを保存する。
    ディレクトリ名は半角にし、なるべく浅い場所に作成すると余計なトラブルが少ない。
  2. Encode.bat の2行目を作業対象の動画ファイルがあるディレクトリに合わせて修正。
  3. enc_xxxxx.bat の最終行を(1)で作成した実行ディレクトリに合わせて修正。
  4. 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も使う)

 

 使い方

  1. EDCBから呼び出す場合
    EDCBの録画後実行Batに、好みのパラメータを記載した enc_xxxxx.bat を指定。
    例:コード欄に貼ったサンプル enc_xxxxx.bat 記載の 「exeparm=000020000」は、
    1280x720,16:9,crf22,H265,音声コピー,tssplit実行,リネーム実行,シャットダウンしない
    の設定でエンコードされる。
    (Encode.bat 単独起動すると設定パラメータ一覧が表示される。)

  2. 手動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にしてみるとか、いろいろ試したいとこはあるけどまた今度。