PowerShell + QSVで自動エンコード・自動CMカット part1
その時は録画後のTSファイルをそのまま自動エンコードするだけのものでした。
今回は自動でCMカットする機能などを付けたスクリプトです。
正直中途半端なところではあるのですが・・・
ある程度パワーユーザー向きとなっています。
PowerShell + QSVで自動エンコード・自動CMカット part1
PowerShell + QSVで自動エンコード・自動CMカット part2
PowerShell + QSVで自動エンコード・自動CMカット part3
CMカット成功でも、カットしたCMが一瞬から数秒残ることがあります。
また、失敗となる場合もあります。例えば、
CMが丸々残っていたり、本編がカットされるなどです。過度な期待をしないでください。 ただ、色々条件を付けてなるべく失敗しないようにしています。
実際にやってみました。確認映像が白黒だったりするのはわざとです。
※スクリプト使用上の免責事項 紹介するスクリプトはソースTSファイルを削除しないようになってはいますが、 スクリプト使用の際は全て自己責任でお願い致します。念のため。 |
スクリプト(CLIEnc4TS.ps1)の特徴
・スクリプトはcmdshell(.bat)でなくPowershell(.ps1)を使用 ・QSVEncCを使用したTSの高速エンコード/mp4の作成 ・多少使えそうな自動CMカット ・TSの字幕を抽出してmp4に格納 ・複数の音声をmp4に格納(元TSが5.1chでも一応エンコード可能。) ・CMカットエンコードを行っても高速(Corei7 3770,地デジ30分で処理時間大体8~9分) ・元ソース30分(2.4GB)がエンコードにより800MB、 CMカットも行えば6分削減できるので約640MBに圧縮が出来ます。 |
PowerShellはcmdshellとさほど難易度は変わらずに複雑な計算が簡単にできます。
自動CMカット以外にも、字幕・副音声を格納できるようにしました。映画番組にいいですね。
5.1ch音声を含むTS(神撃のバハムートなど)でもエンコード可能ですが、
5.1chを保持しているか確認出来ていません。ミックスダウンしているかも。
また、TSファイルの読み込み方法を改善したので自動CMカットを行っても速いです。
勿論スペックや、エンコード設定に寄りますが自分の環境ではこれぐらい。
CMカットすると30分番組を約24分のmp4にする事が出来ます。
CMカットした話数 | 余分に保存出来る本数 | 大きさ(GB) |
4 | 1 | 0.64 |
100 | 25 | 16 |
360(12話×30本) | 90 | 57.6 |
1440(年間) | 360 | 230.4 |
行わない場合とくらべて1クール分余分に録画する事が可能です。
スクリプト使用要件
・録画してTSファイルを作成出来る ・Avisynthを使ったQSVエンコードが出来る ・cmdshell/ powershellスクリプトが多少わかる ・ググれる ・@kisaragi57をフォローする(任意) |
スクリプトを書くわけではないので多分問題ないかと思います。
Twitterではスクリプト更新情報や注意事項など、
スクリプトに纏わる事も偶につぶやいてるので、フォローしていただけたら。
すぐ返信出来ないかもですが質問もTwitterからお気軽にどうぞ!
今回もとりあえず方針を最初に書いておきましょう
エンコード方針
・フリーウェアを使用する ・主に地上波アニメの録画TS想定(1話30分約2.4GB) ・時間をかけずに高画質 ・自動CMカットを行う ・ロゴ除去などのフィルタは使わない ・インターレースは保持 ・ファイルサイズは大体1GB以下であればOK(1話平均800MB) ・リサイズ無しでオリジナルサイズ ・インタレ解除、フィルタは再生プレーヤー依存(後ほど説明) |
アニメを想定していますが、映画でもドラマでも同様にカット可能です。
処理の流れ
1.指定フォルダに入っているTSをリネーム 2.TsSplitter処理 3.TSの解析 4.AAC抽出 5.FAW偽装→解除してディレイの適用 6.Avs作成 7.CMカット処理 8.QSVEncCエンコード 9.字幕ファイル抽出・トリミング 10.mp4boxで結合 11.残骸ファイル移動・削除 12.SCRenameでリネーム | 7.CMカット処理 1.AAC→WAV /Soxによるゲインアップ 2.無音区切りファイルの作成 3.logoframe実行 4.Trimコード作成→Avs書き換え 5.aacをaaceditでトリム適用 |
今回はディレクトリ方式で、特定のディレクトリに存在するTSを処理対象としました。
CMカット処理は長いので別に書いてます。
CMカットせずに単純にエンコードするように設定も出来ますが、
その時は7の処理を飛ばすことになります。
自動CMカットの方針
・データ容量削減をする ・CMが取り込まれるより、本編カット防止を優先する ・一瞬~数秒CMが入っても気にしない ・本編の冒頭/末尾が数フレーム削れる可能性は我慢する ・全体の処理速度がなるべく落ちないようにする ・結果を確認せずにソースを削除した場合、失敗していても我慢出来る |
最大の目的は容量削減であって、スムーズな視聴ではありません。
上の方針がOKなら、そこそこ実用性のある自動CMカットだと思います。
自動CMカットの基準
無音情報 | CMとCM、CMと本編間に存在する無音のことです。 何dBまでの音を無音として、それが何ミリ秒存在するなら 映像の区切りと判断します。 |
ロゴ情報 | 放送局のロゴです。基本的にロゴは本編に表示されCMには表示されません。 これからロゴが表示されていたら本編と判断します。 |
CMの長さ | 色々有りますが基本的に1本15・30秒が多いです。 一つの区間だと合計60秒くらいです。もっと長いのもあります。 |
あとCMの長さを元にCMと本編を判断しています。
自動CMカットが失敗する場合
・無音情報が正しくない | |
映像間の音量/ 長さが許容範囲を超えている | CMなのにCMと判断されない長さになる |
・ロゴ情報が正しくない | |
本編中にロゴが存在しない | そのまま。ロゴ情報なしで計算することに |
CM中にロゴが存在する | CMを本編として取り込んでしまう |
台風などでL字テロップが出る | ロゴが検出できなくなりロゴ情報なしで計算 |
元々は音声と放送情報のみでCMカットするつもりだったので、
ロゴ情報がなくてもある程度の精度でCMカットは可能ですがお勧めしないです。
また、本編の冒頭と末尾は無音/ロゴ情報共に機能しない場合が多いので、
数フレーム削れる可能性があります。それを抜かせば、
無音/ロゴ情報が正常なら本編がカットされる事はほぼないです。
他の自動エンコード・CMカットについて
他にも色々あります。
自動TSエンコードバッチ(AutoConvert) ロゴ検出型自動CMカットプログラム logoGuillo TVRock + Aviutl で全自動CMカット&エンコード Comskip で MPEG2-TS の CM を自動検出して ffmpeg でカットする |
今回のスクリプトを書いてみた感じです。
自動CMカットで「join_logo_scp」を使用する方法は、
今回の方法と似ていて精度も高い様なのでこちらを試してみるもの良いかと思います。
とりあえずスクリプトの機能説明はここまでとし、導入説明に入って行きたいと思います。
この段階で録画してTSファイルを作成出来るようにして下さい。
Avisynthを使ったQSVエンコードをする
出来てる方は読み飛ばして構いません。よくわからない方は以下の記事を読んで下さい。
Aviutl+QSVでエンコードしてみる(core i7 3770+Z77)
QSVEncC+avisynthで高速自動エンコードする その1
PowerShellスクリプトの説明
基本的な事は以前にPowerShellについての記事を書いたので読んで下さい。
PowerShellを使ってみた
あと下も合わせて見ておけば、スクリプトの理解に役立つと思います。
PowerShell基礎文法最速マスター - PowerShell Scripting Weblog
細かい所はスクリプトと一緒に説明します。
想定するファイル構造
というより自分のファイル構造ですが以下の通りになっています。
※スペースなどを入れるとエラーとなるので、パスには半角英数字のみを使用して下さい。
[Rec] //EDCB,TvRockで録画したTSファイル保存場所 ┗[Encode] //エンコードする場所、処理に使用するツール類の保存場所 ┣[Program] //処理に使用する全てのツール類の保存場所 ┃ ┣[logo] //ロゴファイルの保存場所 ┃ ┣[TsSplitter] //各ツールのフォルダ ┃ : ┣[TrashTS] //処理終了したTSの保存場所 ┗[log] //エンコードログの保存場所 |
必ずこういう構造である必要はないので自由に変えてもらって構いません。
ただ各ツールのパスは「Program」からサブフォルダ含めて検索し自動設定するので、
Avisynthを除いたツール類はひとつのフォルダにまとめておいて下さい。
因みにCLIenc4TS_ver0.4から「Rec」から「Encode」に自動で移動してから、
エンコードが実行されます。TSが存在せず移動できない場合はエンコードされません。
手動でエンコードする時は「Rec」にTSをおいて実行しましょう!
ツール類
処理に必要なツール
(全てコマンドラインツール、ps1、batファイルのいずれかです。GUIツールは使いません。また32bit統一のはず。)
ツール名 | Ver | 説明 |
CLIEnc4TS | 今回紹介するps1スクリプト。これを実行してエンコードします。 | |
Avisynth | 公式2.5.8 | スクリプトベースのビデオ編集ソフトウェア。 ※これは通常どおりシステムドライブ( C:\Program Files (x86) )に インストールする様にして下さい。 |
MediaInfo | 0.7.70 | 動画ファイルや音楽ファイルのコーデック解析ソフト。CLI版をダウンロードして下さい。 |
QSVEncC( | 1.25 | 肝のQSVエンコーダ。aviutl用のGUI版もありますが、自動化のためにCUIを使います。 |
TsSplitter | 1.26 | TSファイルから不要なデータを削除します。(30分アニメなら300MBくらいカットできます) |
fawcl | 0.11 | FakeAacWavのCLI版。aacをwavに偽装して無劣化で編集できるようにします。 |
MP4Box | rev5499 | 映像(264)と音声(aac)して合成してmp4動画ファイルを作成します ※取得方法が特殊です。MP4Box 導入の備忘録の記事を参考にして下さい。 |
FAAD | 0.7 | AAC デコーダである FAAD にいくつか機能を追加し、エラー耐性を強化した改造版 |
Sox | 14.4.1 | コマンドラインで音声編集するツールです。CMカット処理のゲインアップで使います。 |
wave2chapter | 0.02 | WAVEファイルから無音声部分を探しタイムコードを出力します。無音情報処理に使用。 ※「ts2aac」というソフトに付属されています。up0551 |
logoframe | 1.15 | 動画から固定位置半透明ロゴが表示されている区間を検出します。ロゴ情報処理に使用。 ※「join_logo_scp_set2.zip」内にlogoframeが入っています。 |
SCRename | 4.1 | しょぼかるから番組名、話数、タイトル、放送局を取得しリネームします。 |
ts_parser | 0.0.15.0 | MPEG-2 TSに格納された映像/音声データに関して <解析/抽出> を行うツールです |
Caption2Ass_PCR | TSファイルから字幕を抽出し、.ASS あるいは .SRT 字幕ファイルを作成します。 | |
SrtSync | 0.1.9 | 映像をカットした場合、それに合わせて時間調整したSRT字幕ファイルを作成します。 |
GB | 「ゴミ箱に送る」コマンドを使用可能にします。 | |
aacedit2 | avsに記述されたTrim情報を元に音声をカットする |
Avisynthのプラグイン
BassAudio.dll bass.dll | BASSオーディオライブラリを使った音声入力プラグイン。 数多くのファイルフォーマットに対応。これらで分割したaacを音声を読み込みます。 |
bass_ac3.dll bass_aac.dll | 同上 |
LSMASHSource | 様々なファイル形式を高速に読みこむ事が出来ます。結果として全体の処理速度が向上します。 |
ロゴファイル作成に必要なソフト
Aviutl | 定番の高機能な動画編集ソフトです。今回はロゴファイル作成のみに使用 |
ロゴ解析プラグイン | 放送局ロゴを解析しlgdファイルを作成するaviutlの拡張プラグインです。 回答して出来たファイルをaviutl.exeと同じディレクトリにコピーしてインストール |
各ツールの導入に関して
Avisynthを除いた処理に必要なツールは[Program]に全て保存して下さい。
ツールのバージョンは基本的に最新版を使用していれば問題ないと思います。
・mp4box
ただ、mp4boxはバージョンによって音ズレなど不具合が発生したりするので、
GPAC.Frameworkからmp4box含め5種類のファイルを抽出したものを使用して下さい。
MP4Box 導入の備忘録
・Avisynthのプラグインのインストール
Avisynthインストール後以下のエントリを参考にして下さい。
高度な動画編集の必需品「AviSynth」の使い方
・放送局ロゴデータの作成
Aviutlを用いたロゴデータの作成方法は以下を参考にして下さい。
ロゴデータを作成する
自分は以下の用に作成しています。ロゴ作成後は[logo]においてください。
1.アニメの録画ファイルを用意する(一般的な30分番組でおk) 2.aviutlで全フレームにロゴが表示されるように編集する。 3.[設定]-[ロゴ解析設定]を起動 4.ロゴを上下左右2pixelぐらい余裕を持って囲む 5.閾値を16に設定 6.解析実行して暫く待つ 7.解析が終わったら保存してlgdファイルを作成する |
これは精度の良いロゴの作り方とはいえません。がlgdファイルをすぐ用意する事ができます。
多少難易度はあがりますが高精度なロゴの作成方法はあるのでぐぐってみてください。
・ロゴのファイル名設定
上にも書きましたが[Program]からファイル名検索して自動でロゴファイルのパス設定します。
新たにロゴを作成する人は以下のファイル名にすればスクリプト編集しなくて済みます。
日本テレビ | ntv |
テレビ東京 | tvtokyo |
テレビ朝日 | tv_asahi |
TBS | tbs |
フジテレビ | fujitv |
TOKYOMX1 | mx1 |
テレ玉 | teletama |
BS-TBS | bs_tbs |
BS11 | bs11 |
BSフジ | bs_fuji |
BS日テレ | bs_ntv |
存在しない局は取得していないか、視聴出来ない地域なので各自設定して下さい。
とりあえずここまでで、ツールやロゴの準備が出来ました。お疲れ様です。
次にCLIEnc4TS.ps1の使用/設定方法を説明していきたいと思います。
- 関連記事
-
- PowerShell + QSVで自動エンコード・自動CMカット part3
- PowerShell + QSVで自動エンコード・自動CMカット part2
- PowerShell + QSVで自動エンコード・自動CMカット part1
- 【QSVEncC】不完全な番組前後の自動CMカット【avisynth】
- MP4ファイルを無劣化で編集する
| エンコード | 20:40 | comments:4 | trackbacks:0 | TOP↑
powershell2.0だと、以下の行を書き換える必要があるようです。
78行目
$Oldpath = @(Get-ChildItem $Save | foreach{ $_.fullname })
957行目
$SplitSrc_Maxsize = ( $SplitSrc | foreach{$_.length} | Measure-Object -Maximum).Maximum
1183行
$DelteFile = (Get-ChildItem $SrcParent $NameANDExt | foreach {$_.fullname})
また、&$faad &$Sox &$logoframe &$QSVEncC実行箇所で以下のエラーが出ますが問題無く動きます。こっちは原因不明です、、、
+ CategoryInfo : NotSpecified: (場所によって異なるので省略) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
| 藤枝 | 2015/05/24 05:24 | URL |