大昔に一度書いています(TVRockの録画ファイル管理を考える | 徒労日記)が、録画後のファイルはバッチで自動的整理&変換処理をしています。ところが最近その自動処理が動かなくなってしまいました(おそらくTVRockのバッチファイル1KB制限)。
いい機会なので録画後処理の部分のみを取り出し、バッチファイルを呼び出す形にしました。
2013/05/06 更新
大分変更したためバッチファイル、本文含めて書き換えます。
処理の要約
- 番組表から1クリックで予約した番組には何もしない(単発録画とみなす)
- 自動録画キーワードにて予約された録画は、最新と一週間前の回のみ保持する
- さらに特定の文字列のある番組は追加でエンコードなどの処理を行う
想定しているフォルダ構造
D: └─ServerFolders └─ビデオ └─TVRock録画保存フォルダ"VLIB" ├─保管番組 ├─一つ前 └─最新
操作されるのはTVRockの録画保存先に指定した”VLIB”フォルダ配下だけ。今回録画はWHS2011で行っているのでこの構造ですが、ご使用の環境に合わせてバッチファイルのVLIB=を変更してください。
「最新」と「一つ前」にはtsファイルが入ります。「保存番組」にはH.264で変換した高画質のファイルを格納します。
ツール類は全部Cドライブ下にbonというフォルダを作り、ツールごとに格納してあります。
必要なツール
- TVRock 0.9u2を(TvRockなページ)
- BonTsDemux mod 10k7(DTV関係ツール)
- Multi2Dec(DTV関係ツール)
TVRockによる録画環境はできているものとします。まだの場合はPT2導入から視聴までまとめ | 徒労日記などをご覧ください。BonTsDemuxにはあらかじめ高画質H.264用のプロファイル(X264_HIGH_WXGA)と、iPhone用の低画質プロファイル(iPhone)が用意してあります(同じくまだの方はiPhone用動画に使うFFmpegにはキマリがある | 徒労日記参照)
バッチファイル本体
rem 順番に 1.ファイル名(%2) 2.自動検索キーワード(%a) 3.自動検索詳細キーワード(%b) rem ※後ろの二つはダブルクオーテーション(")で囲わない rem %aの有無でシリーズ録画かを判定。有ればファイル格納を行う。空ならスポット録画と判断 rem %bに特定文字列があった場合、それぞれマッチした処理を行う(高画質H264エンコ、iPad用エンコ等) SETLOCAL SET TSspl="C:\bon\TsSplitter\TsSplitter.exe" SET TSsplPARA=-SD -1SEG -WAIT2 -SEP3 -OVL5,7,0 SET BTD="C:\bon\BonTsDemux\BonTsDemuxC.exe" SET M2DPATH="C:\bon\Multi2Dec\Multi2DecDos.exe" SET VLIB=D:\ServerFolders\ビデオ\TS SET TSSIZE=524288000 REM 番組の本編を判断するファイルサイズの閾値 500MB=1024^2*500 SET ENCKEY=保管番組 SET TWTCNSL="C:\bon\TvRock\twtcnsl.exe" ECHO; ECHO ----------------- ECHO %~1 の処理を開始します ECHO %DATE% %TIME:~0,-6% ECHO ----------------- ECHO; REM 録画用HDDの有無CHK IF NOT EXIST "%VLIB%" ( %TWTCNSL% /t "@xxxxxxxx ERROR:処理先ディスクが見つかりません。HDD等を確認してください #TSflow" GOTO STOP ) :CHECK IF "%~1"=="" ( ECHO ERROR:処理対象のファイル名が指定されていません。 GOTO STOP ) IF "%2"=="" ( ECHO ERROR:検索キーワードが指定されていません。 GOTO STOP ) :TSMOVE ECHO INFO:ファイル移動開始 del "%VLIB%\一つ前\*%2*.ts" /Q move "%VLIB%\最新\*%2*.ts" "%VLIB%\一つ前\" move "%VLIB%\%~1" "%VLIB%\最新\" ECHO INFO:ファイル移動終了 IF "%3"=="" ( ECHO INFO:無変換ファイルの為、処理を終了します。 GOTO END ) :TSSPLITTER ECHO %DATE% %TIME:~0,-6% ECHO INFO:放送データ分割処理開始 %TSspl% %TSsplPARA% "%VLIB%\最新\%~1" ren "%VLIB%\最新\%~1" "%~n1_original.ts" for %%F in ("%VLIB%\最新\%~n1_HD.ts") do if %%~zF GEQ %TSSIZE% ren %%F "%~n1_main.ts" for %%F in ("%VLIB%\最新\%~n1_HD-1.ts") do if %%~zF GEQ %TSSIZE% ren %%F "%~n1_main.ts" for %%F in ("%VLIB%\最新\%~n1_HD-2.ts") do if %%~zF GEQ %TSSIZE% ren %%F "%~n1_main.ts" IF NOT EXIST "%VLIB%\最新\%~n1_main.ts" GOTO FAIL_SPLIT :TSENC ECHO %DATE% %TIME:~0,-6% ECHO INFO:エンコード処理開始 IF "%3"=="%ENCKEY%" ( %BTD% -i "%VLIB%\最新\%~n1_main.ts" -o "%VLIB%\保管番組\%~n1" -encode "anime_X264_HIGH_HD720" -nd -start -quit ) IF ERRORLEVEL 1 GOTO FAIL_ENCODE ECHO INFO:エンコード処理終了 :ENDCHK IF EXIST "%VLIB%\保管番組\%~n1.mp4" ( %TWTCNSL% /t "INFO:エンコード完了。「%~n1」を保管場所へ投入しました #TSflow" GOTO END ) IF EXIST "%VLIB%\最新\%~n1_main_dec.txt" GOTO FAIL_DECODE :TSRECOVER ECHO WARN:エンコード失敗のため、スクランブル解除を試みます %M2DPATH% "%VLIB%\最新\%~n1_main.ts" IF NOT EXIST "%VLIB%\最新\%~n1_main_dec.ts" GOTO FAIL_FAILRECOV move "%VLIB%\最新\%~n1_main.ts" "%VLIB%" ren "%VLIB%\最新\%~n1_main_dec.ts" "%~n1_main.ts" GOTO TSENC REM ****以下エラー終了処理**** :FAIL_SPLIT ECHO ERROR:データのスプリットを試みましたが、処理に失敗しました。 msg dijkstra "%~n1のスプリットに失敗しました。" %TWTCNSL% /t "@xxxxxxxx ERROR:%~n1のスプリットに失敗しました。 #TSflow" GOTO END :FAIL_FAILRECOV ECHO ERROR:スクランブル解除を試みましたが、処理に失敗しました。 msg aaaaaa "%~n1のスクランブル解除に失敗しました。" %TWTCNSL% /t "@xxxxxxxx ERROR:%~n1のスクランブル解除に失敗しました。 #TSflow" GOTO END :FAIL_DECODE ECHO ERROR:スクランブル解除を実施しましたが、出力ファイルが得られませんでした。 msg aaaaaa "ERROR:%~n1の変換に失敗しました。" %TWTCNSL% /t "@xxxxxxxx ERROR:%~n1のスクランブル解除を実施しましたが、出力ファイルが得られませんでした。 #TSflow" GOTO END :FAIL_ENCODE ECHO ERROR:エンコード処理自体に失敗しました。ログを確認して下さい。 msg aaaaaa "ERROR:%~n1のエンコード処理自体に失敗しました。" %TWTCNSL% /t "@xxxxxxxx ERROR:%~n1のエンコード処理自体に失敗しました。 #TSflow" GOTO END :END ECHO; ECHO ----------------- ECHO %~1 の処理を終了しました ECHO %DATE% %TIME:~0,-6% ECHO ----------------- ECHO; :STOP
使い方
上記バッチファイルをTVRockのフォルダに保存します。TVRockの設定を開いて「プロセス」タブを開いて「コマンドを実行する」にチェックを入れます。ファイル名を”TSflow.bat”とした場合、
TN:"C:\bon\TvRock\TSflow.bat" "%2" %a %b
と一行追加します。TN:はTVRock 0.9u2でのみ使える録画後実行命令につける文頭句です。
動き解説
- SETLOCALの後、各フォルダやコマンドの場所を入いれる。
- ファイル名が無い場合や、自動検索キーワード(%a)が無い場合は未処理録画としてそのまま終ります(ファイルはルートに置かれる)
- 自動検索キーワード(%a)録画番組なら、「一つ前」フォルダにあった2週前の番組を削除し、1週前の番組を「最新」から「一つ前」へ。VLIBに録画された新しいファイルを「最新」に入れます。
- 自動検索詳細キーワード(%b)に何も入っていなければそのまま終了。
- TsSplitterにて録画を3つのファイルに分割。一番大きいファイルを録画本体と判断(しきい値にて調整)し、エンコードに回す。
- 自動検索詳細キーワード(%b)がENCKEYと同一だった場合(例では”保管番組”)、高画質プロファイル(“anime_X264_HIGH_HD720”)でエンコード
- 想定したファイルが作成されていれば処理完了。
- エンコードに失敗していた場合、スクランブル解除ミスを疑ってMulti2Decでスクランブル解除を試みます。
- 再エンコードを行い、それでもダメな場合(デコード時のTEXTは出ているが、結果の.mp4が無い場合)は画面にポップアップの警告を出してギブします。
それぞれのエラータイプに合わせて、Twitterを使い報告を行います。
蛇足
今回は「詳細キーワード」が使われていなかったので、そこに好きな文字列を入れてバッチファイルで動作パターンを分ける様にしました。IF “%3″==の行を増やせばいくらでも対応を増やせます(エンコード品質を変えたり)
反面、毎回録画追加時に”保管番組”と追記する手間があるのと、条件をorにするのを忘れない様する必要があります。
半端にTsSplitterの準備もしてありますが、コマンドラインだけでは番組本編ファイルの判断がなかなか難しい。今のところ困っていないので使用しない事にしています。この辺りも希望する人はtaskencというvbsファイル(MediaCoder @Wiki – TVRockとの連携)が公開されているので、それを参考にするといいでしょう。
2013/05/06 追記TVRockのコマンド実行欄の設定
CS:"C:\bon\TvRock\TwitRock.exe" "[%h]番組「%d」 録画開始" "%g" "%5" CE:"C:\bon\TvRock\TwitRock.exe" "[%h]番組「%d」 録画終了" "%g" "%5" CR:"C:\bon\TvRock\TwitRock.exe" "%d" "%i" "%j" "%k" "%l" "%g" "%5" TN:"C:\bon\TvRock\TSflow.bat" "%2" %a %b >> C:\bon\TvRock\TSflow_execlog.txt
番組の予約報告にTwitRockを使い、動作を報告します。バッチファイルを呼び出す際はログを取ります。
お世話になります。こちらの自動処理について質問ですが、
録画した番組に対して複数のエンコード処理が貯まっていった場合は、
キューに入って順番にエンコードしていく形でしょうか?
もしCPUパワーが足りない場合、録画した番組がどんどん増えていって
エンコードが追いつかない、といった事態などありえますでしょうか?
基本的な質問で申し訳ありませんが、お手すきの際にご回答願います。
▽くまモンさん
2つの場面が考えられます。
1.1つの録画について、2つ以上のエンコードを行う場合。
例えば保管用とiPhone用の2つのエンコードを行う設定の場合は、
バッチは1行づつ、前のコマンドの終わりを待つので多重実行されて
しまう事はありませんので大丈夫です。
2.エンコ中に別の録画が終わり、そこでもバッチを呼び出した場合。
これは普通に2個(ないし複数)同時エンコードされてしまいます。
ファイル処理に関しては複数実行しても問題がない事は確認済みですが、
エンコ処理の重さにについてはCPU処理能力と相談する必要があります。
ご返信が遅くなり、大変申し訳ありませんでした。
なるほど、もし多チャンネルの場合などは、バッチエンコードしようとCPU負荷が高くなる可能性がありますね。シングルチューナーの場合は録画本数を調整すれば大丈夫そうですね。
もし本ブログの方式で運用させて頂くようになりましたら、またご報告させて頂きます。どうもありがとうございました。これで熊本に帰れます。
▽くまモンさん
プロセスリストを取得してIFで動かす、なんてできそうな気もしますが、
いまどきのCPUなら2重でエンコしながら録画しても大丈夫です。
くまモンは最近北海道にも進出してますね。ゆっくりしていってね!