以前作成したTS半自動エンコードバッチは、ファイル名に「&(半角アンド)」があると動作しなかったり、局名に「 (半角スペース)」があるとCMカットができなかったりと、ファイル名まわりに問題がありました。対処しようかと思いましたが、今さらバッチファイルの仕様に振り回されるのも嫌だったので、勉強を兼ねてPowerShellスクリプトで作り直してみました。
前提条件
スクリプトを使用するには、以下のソフトが動作する環境が整っている必要があります。各ソフトのインストール方法などは、以下の記事を参照してください。
- TsSplitter
DGIndex
FakeAacWav
⇒AviUtlでTSをCMカットしてMP4にエンコードしてみるメモ - logoGuillo
⇒logoGuilloとAviUtlで半自動CMカットをする方法 - 最新版のDGIndexを使用する場合はこちら
⇒DGIndexの修正版をビルドしてみたので手順のメモ - 修正したAVSテンプレートはこちら
⇒DGIndexのAVSテンプレートを更新しました(2017/07/28)
スクリプト
TS半自動エンコードスクリプトです。メモ帳などに貼り付け、拡張子を「ps1」にして適当に名前を付けて保存してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
############################################################# # TS半自動エンコードスクリプト # # by Heet (https://heetnote.com/) # # 【更新日】2017/11/17 # # 【機能】TSをAviUtlでエンコードするための下準備をします。 # # 1. TsSplitterで不要なサービスを削除 # # 2. DGIndexでd2v/aacに分離、avsを作成 # # 3. FAWでaacを疑似wavに変換 # # 4. logoGuilloでCMカット用フレームリストを作成 # # 5. AviUtlでavsを読み込んで編集してください # # 【使用方法】 # # 1. 本スクリプトへのショートカットを作成し # # リンク先を以下のように設定してください # # 「powershell -File "D:\Video\TSCook.ps1"」 # # 2. スクリプトの実行が無効になっている場合は # # PowerShellを管理者権限で起動し # # 以下のコマンドで実行ポリシーを変更してください # # 「Set-ExecutionPolicy RemoteSigned」 # # 3. ショートカットにTSファイルをD&Dしてください # # 右クリックの「送る」に登録する場合は # # エクスプローラで「shell:sendto」を開き # # フォルダにショートカットを入れてください # ############################################################# ###### 環境設定 ############################################# # 注) フォルダ指定の最後に「\」を付けないでください。 # 出力先フォルダ $OutputDir = "D:\Video" # 「TsSplitter.exe」のパス $TsSplitterPath = "D:\AviUtl\TsSplitter\TsSplitter.exe" # 「DGIndex.exe」のパス $DGIndexPath = "D:\AviUtl\DGIndex\DGIndex.exe" # AVSテンプレートのパス $AvsTemplatePath = "D:\AviUtl\DGIndex\template.avs" # 「fawcl.exe」のパス $fawclPath = "D:\AviUtl\FakeAacWav\fawcl.exe" # logoGuillo関連の設定 $LOGOG_PATH = "D:\AviUtl\logoGuillo\logoGuillo.exe" $AVS2X_PATH = "D:\AviUtl\logoGuillo\avs2pipemod\avs2pipemod.exe" $AVSPLG_PATH = "D:\AviUtl\DGIndex\DGDecode.dll" # ロゴデータ(.lgd)とロゴ検出パラメータ(.param)の格納フォルダ # TSファイル名に含まれる放送局名と一致する必要があります。 # ex)「ABCDE 第1話 (20171010-2300 BS11イレブン).ts」の場合 # 「BS11イレブン.lgd」と「BS11イレブン.lgd.autoTune.param」が必要 $LOGO_DIR = "D:\AviUtl\logoGuillo" ###### オプション ########################################### # CS放送の分割を行う場合は1を指定 $CSEnable = 1 # 番組情報及びPMT情報で分割する場合は1を指定 $SEP2Enable = 1 # 分割する際に糊代を付加する場合は値を指定 $OVLVal = "-OVL25,35,0" # 分割時に最も大きいTSファイル以外は削除する場合は1を指定 $DelTSEnable = 1 # 最も大きいTSの半分以上のサイズのTSを残す場合は1を指定 # 番組途中でPMT情報が変わる場合の対策 $KeepTSEnable = 1 # d2v.badを使用する場合は1を指定(d2vはd2v.bakにリネームします) $UseBadEnable = 1 ###### 設定終了 ############################################# ###### 引数確認 ############################################# if($Args.Count -eq 0) { Write-Host "引数がないため処理を終了します。" Write-Host "" Read-Host "続行するには何かキーを押してください . . ." exit } ###### 処理開始 ############################################# Write-Host "" Write-Host "============================" Write-Host " 処 理 開 始 " Write-Host "============================" Write-Host "" # 出力先フォルダを作成 if ((Test-Path -Path $OutputDir) -eq 0) { New-Item -Path $OutputDir -ItemType Directory Write-Host "" } # TsSplitterのパラメータを設定 $TsSplitterCS = "" $TsSplitterSEP2 = "" $TsSplitterOVL = "" if ($CSEnable -eq 1) { $TsSplitterCS = "-CS" } if ($SEP2Enable -eq 1) { $TsSplitterSEP2 = "-SEP2" $TsSplitterOVL = $OVLVal } ##### 入力ファイル一覧出力 ##### Write-Host "====== 入力ファイル一覧 ======" foreach ($InputItem in $Args) { Write-Host $InputItem } Write-Host "" ##### 入力ファイル数分ループ ##### foreach ($InputItem in $Args) { # TS以外は処理しない if ($InputItem -like "*.ts" -eq 0) { continue } Write-Host "====== 処理するファイル ======" Write-Host $InputItem Write-Host "" Write-Host "====== TsSplitter開始 ======" # TsSplitterにTSを渡す & $TsSplitterPath -SD2 -SD3 -1SEG $TsSplitterCS $TsSplitterSEP2 $TsSplitterOVL -OUT $OutputDir -WAIT2 $InputItem Write-Host "" # 拡張子を除いたファイル名を取得 $BaseName = [System.IO.Path]::GetFileNameWithoutExtension($InputItem) # 最も大きいTSを残して削除 if ($DelTSEnable -eq 1) { $DelItemList = Get-ChildItem -Filter "*.ts" -Path $OutputDir | Where-Object {$_.Name.Contains($BaseName + "_")} | Sort-Object Length -Descending for($i = 1; $i -lt $DelItemList.Count; $i++) { # 最も大きいTSの半分以上のサイズなら削除しない if($KeepTSEnable -eq 1) { if($DelItemList[$i].Length -ge $DelItemList[0].Length / 2) { continue } } Write-Host "削除:" $DelItemList[$i].Name -NoNewline Write-Host "" Write-Host "サイズ:" ([math]::round($DelItemList[$i].Length / 1MB, 2)) "MB" -NoNewline Write-Host "`n" Remove-Item -LiteralPath $DelItemList[$i].FullName -Force } } # 出力されたTSファイル数分ループ $TsItemList = Get-ChildItem -Filter "*.ts" -Path $OutputDir | Where-Object {$_.Name.Contains($BaseName + "_")} foreach ($TsItem in $TsItemList) { Write-Host "<<<<<< $TsItem >>>>>>" Write-Host "" Write-Host "====== DGIndex開始 ======" Write-Host "--- 処理中 ---" # DGIndexにTSを渡す $DGIndexOut = $OutputDir + "\" + $TsItem.BaseName & $DGIndexPath -i $TsItem.FullName -o $DGIndexOut -ia 5 -fo 0 -om 2 -yr 2 -at $AvsTemplatePath -hide -exit | out-null Write-Host "--- 完了 ---" Write-Host "" # d2v.badを使用する if ($UseBadEnable -eq 1) { $D2v = $DGIndexOut + ".d2v" $D2vBak = $DGIndexOut + ".d2v.bak" $D2vBad = $DGIndexOut + ".d2v.bad" if (Test-Path -LiteralPath $D2vBad) { # ***.d2vを***.d2v.bakにリネーム Move-Item -LiteralPath $D2v $D2vBak # ***.d2v.badを***.d2vにリネーム Move-Item -LiteralPath $D2vBad $D2v } } # AACファイル数分ループ $AacItemList = Get-ChildItem -Filter "*.aac" -Path $OutputDir | Where-Object {$_.Name.Contains($TsItem.BaseName + " PID")} foreach ($AacItem in $AacItemList) { Write-Host "====== FAW開始 ======" # FAWにAACを渡す & $fawclPath $AacItem.FullName Write-Host "" } Write-Host "====== logoGuillo開始 ======" # logoGuillo用パラメータ設定 $LOGO_PATH = "" $PRM_PATH = "" $VIDEO_PATH = $DGIndexOut + ".d2v" $OUTPUT_PATH = $DGIndexOut + ".avs.txt" # 放送局に対応するロゴデータを検索 $LgdItemList = Get-ChildItem -Filter "*.lgd" -Path $LOGO_DIR foreach ($LgdItem in $LgdItemList) { # TSファイル名にロゴデータ名が含まれるか if($TsItem.Name.Contains($LgdItem.BaseName)) { $LOGO_PATH = $LgdItem.FullName $PRM_PATH = $LOGO_PATH + ".autoTune.param" # ロゴ検出パラメータが存在するか if (Test-Path -LiteralPath $PRM_PATH) { break } else { $PRM_PATH = "" break } } } # ロゴ検出パラメータがあればCMカットを実行 if ($PRM_PATH -ne "") { # logoGuilloを実行 & $LOGOG_PATH -video $VIDEO_PATH -lgd $LOGO_PATH -avs2x $AVS2X_PATH -avsPlg $AVSPLG_PATH -prm $PRM_PATH -out $OUTPUT_PATH -outFmt keyF Write-Host "" } else { Write-Host "--- ロゴデータが見つかりませんでした ---" Write-Host "" } } } Write-Host "============================" Write-Host " 処 理 終 了 " Write-Host "============================" Write-Host "" Read-Host "続行するには何かキーを押してください . . ." |
機能
スクリプトにTSファイル(複数可)を渡すと、以下の処理を自動で実施します。
- TsSplitterを使用して、不要なサービスを削除します。
- DGIndexを使用して、映像(d2v)と音声(aac)に分離し、
AviSynthスクリプトファイル(avs)を作成します。 - FakeAacWavを使用して、音声(aac)を疑似wavに変換します。
- logoGuilloを使用して、CMカット用フレームリストを作成します。
ここまでをスクリプトが行います。これ以降のカット編集やフィルタの設定、エンコードなどの作業は、AviUtlを使用して手動で行ってください。
環境設定
使用前に環境設定を行う必要があります。以下を環境に合わせて設定してください。
- 出力先フォルダ
- 「TsSplitter.exe」のパス
- 「DGIndex.exe」のパス
- AVSテンプレートのパス
- 「fawcl.exe」のパス
- logoGuillo関連の設定
- ロゴデータ(.lgd)とロゴ検出パラメータ(.param)の格納フォルダ
オプションはお好みで設定してください。
使い方
PowerShellスクリプトは、バッチのようにダブルクリックしただけでは動作しません。以下の手順でショートカットを作成してください。
- スクリプト(xxxxx.ps1)へのショートカットを作成します。
- ショートカットのプロパティを開き、リンク先を以下のように設定します。
「powershell -File “スクリプトのパス”」
- ショートカットにTSファイルをドラッグ&ドロップすると、処理が始まります。
- スクリプトの実行が無効になっている場合は、PowerShellを管理者権限で起動し、以下のコマンドで実行ポリシーを変更してください。
「Set-ExecutionPolicy RemoteSigned」
- 右クリックの「送る」登録する場合は、エクスプローラで「shell:sendto」を開き、SendToフォルダにショートカットを入れてください。
バッチ版との機能差分
- ファイル名に半角記号があっても誤動作しないようになったはず。
- DGIndexの進捗状況が表示されなくなりました。特に不便も感じないのでそのまま。
- TS分割時に最も大きいTSファイル以外は削除する場合に、削除するファイル名とサイズを表示するようにしました。
- 最も大きいTSの半分以上のサイズのTSを残すオプションを追加しました。番組途中でPMT情報が変わる場合の対策。
おまけ
TsSplitterで付与されたファイル名(「_HD-2」とか「_CS1(325)」など)を除去するためのスクリプトです。エンコード完了後、できあがったMP4ファイルに対して使用してください。使用方法はTS半自動エンコードスクリプトと同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
function RemoveHDSD($FileName) { if($FileName.Contains("_HD")) { $NewFileName = [Regex]::Replace($FileName, "_HD.*\.", ".") } elseif($FileName.Contains("_SD")) { $NewFileName = [Regex]::Replace($FileName, "_SD.*\.", ".") } elseif($FileName.Contains("_CS")) { $NewFileName = [Regex]::Replace($FileName, "_CS.*\.", ".") } else { $NewFileName = $FileName } return $NewFileName } ###### 引数確認 ###### if($Args.Count -eq 0) { Write-Host "引数がないため処理を終了します。" Write-Host "" Read-Host "続行するには何かキーを押してください . . ." exit } ###### 入力ファイル一覧出力 ###### Write-Host "====== 入力ファイル一覧 ======" foreach ($InputItem in $Args) { Write-Host $InputItem } Write-Host "" ###### ファイル名変更確認 ###### Write-Host "====== ファイル名変更確認 ======" foreach ($InputItem in $Args) { $FileName = [System.IO.Path]::GetFileName($InputItem) Write-Host $FileName $NewFileName = RemoveHDSD($FileName) Write-Host "-> " -NoNewline if($FileName -ne $NewFileName) { Write-Host $NewFileName } else { Write-Host "変更なし" } Write-Host "" } Read-Host "実行してよろしければ何かキーを押してください . . ." ###### ファイル名変更実行 ###### foreach ($InputItem in $Args) { $FileName = [System.IO.Path]::GetFileName($InputItem) $NewFileName = RemoveHDSD($FileName) if($FileName -ne $NewFileName) { Rename-Item -LiteralPath $InputItem $NewFileName } } Write-Host "====== 処理完了 ======" Write-Host "" Read-Host "続行するには何かキーを押してください . . ." |
使用上の注意
- 基本的に自分で使用するためのものなので、バグがある可能性が多々あります。
- お約束ですが、これらのファイルの使用により発生したいかなる損害についても、作者は一切の責任を負いません。