fc2ブログ

PREV | PAGE-SELECT | NEXT

≫ EDIT

PowerShell + QSVで自動エンコード・自動CMカット part1

以前にQSVEncC+avisynthで高速自動エンコードするを書きまして、
その時は録画後の
TSファイルをそのまま自動エンコードするだけのものでした。
今回は自動でCMカットする機能などを付けたスクリプトです。
正直中途半端なところではあるのですが・・・

ある程度パワーユーザー向きとなっています。

PowerShell + QSVで自動エンコード・自動CMカット part1
PowerShell + QSVで自動エンコード・自動CMカット part2
PowerShell + QSVで自動エンコード・自動CMカット part3
スポンサーリンク



まず最初に書いておきますが、100%正確にCMカットはできません。大体90%程度です。
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に圧縮が出来ます。

今まではcmdshellを使用していましたが、今回はPowerShellスクリプトのみで作成しました。
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クール30本ぐらい録画する人は、CMカットを1年(4クール)行えば、
行わない場合とくらべて1クール分余分に録画する事が可能です。

スクリプト使用要件
・録画してTSファイルを作成出来る
Avisynthを使ったQSVエンコードが出来る
cmdshell/
powershellスクリプトが多少わかる
・ググれる
@kisaragi57をフォローする(任意)
多少厳しいですが、powershellについては後述しますし、
スクリプトを書くわけではないので多分問題ないかと思います。

Twitterではスクリプト更新情報や注意事項など、
スクリプトに纏わる事も偶につぶやいてるので、フォローしていただけたら。
すぐ返信出来ないかもですが質問もTwitterからお気軽にどうぞ!

今回もとりあえず方針を最初に書いておきましょう
エンコード方針
・フリーウェアを使用する
・主に地上波アニメの録画TS想定(1話30分約2.4GB)
・時間をかけずに高画質
・自動CMカットを行う
・ロゴ除去などのフィルタは使わない
・インターレースは保持
・ファイルサイズは大体1GB以下であればOK(1話平均800MB)
・リサイズ無しでオリジナルサイズ
・インタレ解除、フィルタは再生プレーヤー依存(後ほど説明)
基本は以前と同じで自動CMカットを行うようになった感じです。
アニメを想定していますが、映画でもドラマでも同様にカット可能です。

処理の流れ
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が入っても気にしない

・本編の冒頭/末尾が数フレーム削れる可能性は我慢する
・全体の処理速度がなるべく落ちないようにする
・結果を確認せずにソースを削除した場合、失敗していても我慢出来る
冒頭にも書きましたが、100%正確なCMカットはこのスクリプトは無理です。
最大の目的は容量削減であって、スムーズな視聴ではありません。
上の方針がOKなら、そこそこ実用性のある自動CMカットだと思います。


自動CMカットの基準

無音情報
CMとCM、CMと本編間に存在する無音のことです。
何dBまでの音を無音として、それが何ミリ秒存在するなら
映像の区切りと判断します。

ロゴ情報
放送局のロゴです。基本的にロゴは本編に表示されCMには表示されません。
これからロゴが表示されていたら本編と判断します。
CMの長さ 色々有りますが基本的に1本15・30秒が多いです。
一つの区間だと合計60秒くらいです。もっと長いのもあります。
自動CMカットは色々な方法がありますが、このスクリプトでは無音とロゴ、
あと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情報を元に音声をカットする
OneDriveはIEがアクセスしやすいかも?

Avisynthのプラグイン
BassAudio.dll
bass.dll
BASSオーディオライブラリを使った音声入力プラグイン。
数多くのファイルフォーマットに対応。これらで分割したaacを音声を読み込みます。
bass_ac3.dll
bass_aac.dll
同上
LSMASHSource 様々なファイル形式を高速に読みこむ事が出来ます。結果として全体の処理速度が向上します。

ロゴファイル作成に必要なソフト
Aviutl
定番の高機能な動画編集ソフトです。今回はロゴファイル作成のみに使用
ロゴ解析プラグイン
放送局ロゴを解析しlgdファイルを作成するaviutlの拡張プラグインです。
回答して出来たファイルをaviutl.exeと同じディレクトリにコピーしてインストール
これら素晴らしいツールを利用してなんとか自動CMカットしようという魂胆であります。

各ツールの導入に関して
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の使用/設定方法を説明していきたいと思います。


関連記事
スポンサーリンク

| エンコード | 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 |

せっかくなので修正&機能追加した物をお渡ししときます。
変更点はだいたい以下の通り。大きめの変更箇所は###で検索して貰えれば引っかかります。
http://sarashi.no-ip.info/files/CLIEnc4TS_ver0.2.ps1

・powershellv2.0対応
 のはず、こちらは途中からv4.0にしてしまったのでもしかしたら動かないかも知れないです。


・$Out_Soxwavの指定が間違っていたのを修正
 エンコード後もゴミが残っていたの、ちゃんと消すようにしました。


・「ディレクトリの設定について」を置換でなくて10-30行の変数を弄れば良いように修正


・実行時に引数指定することで特定ファイル名のものだけを指定可能にした
 powershellコンソールで以下みたいに実行すると、リネームおよびメイン処理対象がファイル名にhogehogeを含む物のみになります。指定しなければ既存同様に作業用フォルダ内全てを対象にします。
  スクリプト.ps1 -targetts hogehoge.ts
  ※実際にはhogehoge.tsではなくて$FilePath$を指定する想定です
 これはedcbの録画後実行batで叩く場合、同時録画しているファイルが同一フォルダにあると不味かったためです。
 windowsのタスクで毎朝8時に実行、みたいな形で処理する場合は-targetts指定せず既存同様の動作でOKかと。


・エンコード完了後に指定フォルダにmp4を移動する処理を追加
 個人的に欲しかったので。


・実行時に引数指定することでcmcut処理を無効にできるように変更
 極力ps1を弄らず、特定の番組のみcmcut無効にしたかったので。
 ps1に手を付けず、以下のようなbatだけで実現できます。
  スクリプト.ps1 -noCMCut -targetts $FilePath$


・実行時に引数指定することでリサイズ処理を追加したかったorz
 以下でインタレ維持しつつ1280x720にリサイズできるはずだったんですがQSVEnC.exeが70%弱で止まります、、、簡単な関数で実現してるので、他にも応用できるかも。
  スクリプト.ps1 -resize


・リネーム対象かつ拡張子がts以外のファイルを$TrashTSに移動する処理を追加
 エンコード済みファイル移動処理を追加したので、edcbの.txtや.errだけが残るようになっていたのでこれを$TrashTSに。

| 藤枝 | 2015/05/25 23:16 | URL | ≫ EDIT

承認待ちコメント

このコメントは管理者の承認待ちです

| | 2016/02/21 01:43 | |

承認待ちコメント

このコメントは管理者の承認待ちです

| | 2016/05/16 22:18 | |















非公開コメント

http://higitune.blog106.fc2.com/tb.php/131-ba42e384

PREV | PAGE-SELECT | NEXT