TSファイルの録画時間表示と指定時間分割 TsCutter Ver0.05

 TvRockは予約が重複していると次番組の開始と同時に前番組の録画が終了してしまうが、エクスプローラ等から録画ファイルを見ても、東芝RDシリーズのように番組名の末尾に「:次予約開始」が付いたり、録画時間が表示されないので判りづらい。

プログラムの仕様

 そこでMPEG-2 TSファイルに記録されている時間を表示するためのソフトを作ってみた。本当はTSパケットから放送時間を調べられればいいんだけど、PIDやPAT、PMTあたりは判るものの放送時間などを含むパケットについて詳しくないので手抜きでTsSplitterが生成する放送時間を含んだGOPリストを使うことにした。

録画時間の表示

 例えば「sample.ts」の録画時間を調べたい場合は、TsSplitterで-GOPTIMEを指定して作ったGOPリスト「sample.ts.txt」を用意して「tscutter sample.ts」と入力すると「sample.ts.txt」から最初に出てくる放送時間と最後に出てくる放送時間の差から録画時間を求めて表示する。

 ただ、このままでは放送時間を含まないGOPや末尾のGOPの時間が含まれないので実際の再生時間と比べて誤差が生じる。これらをGOP1つ0.5秒として録画時間に加えることでTVTest+BonDriver_File等で表示される時間と大体同じ値が求められているかと思うが、完全に正確な録画時間ではないので注意が必要。

指定時間ごとに分割

 4GBを超えるTSファイルはFAT32なドライブに置けないし、Windows Live Syncで転送することも出来ないので、指定時間ごとに分割する機能を付けてみた。GOPリストを元にTSパケット単位で分割するので、分割したものも単体のTSファイルとして扱える上、COPYコマンドの/Bオプションで結合すると完全に分割前と同じファイル(FCコマンドの/Bオプションで確認)になる。

 例えば「sample.ts」を30分ごとに分割したい場合は「tscutter sample.ts 00:30:00:000」と入力すると、0時間30分0秒0ミリ秒と同じかそれを超えるGOP単位で分割し、「sample.ts.001.ts」、「sample.ts.002.ts」…のように連続出力する。元通りに結合する場合は「COPY /B sample.ts.001.ts+sample.ts.002.ts… sample.ts」のように入力する。

録画時間をファイル名に含める

 エクスプローラ等でファイル名だけ見れば録画時間やエラーの有無が判るようにリネームを行う機能も付けてみる。エラーの有無はMulti2Decのログファイルがあれば処理するようにしてみた。

 例えば「sample.ts」に録画時間とエラーの有無をファイル名に含めたい場合は「tscutter sample.ts -r」と入力すると「sample.ts.txt」から録画時間を求め、「sample_dec.txt」があればエラーの有無を確認して、ファイル名を「sample (00h30m00s)(Drop=1).ts」のように変更する。

 ドロップが無く他のエラーがある場合は「(Error)」、ドロップもエラーも無くスクランブル解除されてないパケットがある場合は「(Scramble)」とファイル名末尾に付記する。

 尚、-rオプションでファイル名が変更されるのはTSファイルだけで、TsSplitterで出力したGOPリストや、Multi2Decで出力したログファイルは変更されないので、同様な操作を2度行っても「sample (00h30m00s)(Drop=1) (00h30m00s)(Drop=1).ts」のようにリネームされず、「sample (00h30m00s)(Drop=1).ts.txt」が見つからない、とエラーになる。

複数のファイルを一括処理する

 以下の内容のバッチファイルを作って実行すると、Dドライブのルートディレクトリ(D:\)にあるTSファイル全て(*.ts)に対して、GOPリストが無ければ作成、Multi2Decのログファイルが無ければ作成、TsCutterでファイル名に録画時間をエラーの有無を含める処理を行う。TsSplitter.exeやMulti2DecDos.exe、TsCutter.exeはD:\にあるものとしているので、必要に応じて適宜書き換える。

FOR %%I IN ("D:\*.ts") DO IF NOT EXIST "%%I.txt" "D:\TsSplitter.exe" -GOPONLY -GOPCH -GOPTIME "%%I"
FOR %%I IN ("D:\*.ts") DO IF NOT EXIST "D:\%%~nI_dec.txt" "D:\Multi2DecDos.exe" /C "%%I"
FOR %%I IN ("D:\*.ts") DO IF EXIST "%%I.txt" "D:\TsCutter.exe" "%%I" -r

 これをTvRockの設定→プロセス→コマンドを実行するに記述し、各行の先頭に「UE:」を付けておくことで、番組情報取得終了後に自動実行するようにしている。

ダウンロード

TsCutter Ver0.05

  • CRC32: 64952D7D
  • MD5: 5A2EE5E28F498A769A3C9DF1487D7DB7
  • SHA-1: 542286377626824376FC7E592F5E08B99E6A3C44

C言語ソースリスト含む。コンパイルMinGW日本版で行っている。