スプリットが失敗したファイルを、そのまま利用すれば問題ないのだが、手動でリカバリ作業をしたくなるときもある。その手順を備忘録として残しておく。
この作業を行うためには以下のような前提がある。
- スクランブル解除処理は成功していること。(B-CASカードが抜けていた場合などには、対応できない)
- 変換前のファイルが残っていること(あたりまえ)
do-record.sh で、スプリット処理に失敗した場合には、変換前ファイルを削除しないようにした記憶がある。そもそも do-record.sh をどこまでオレオレ仕様に変更したか覚えてないので、最後に全部のせておく。
スプリット処理は、windows 上で行うこととする。録画環境では、TsSplitterLite を利用しているが、そもそも、TsSplitterLite での処理に失敗しているので、他のスプリット方法でないとならないため、そうしている。
まずは、スプリット処理に失敗したファイルを windows 上にコピーする。ファイルは、/var/www/epgrec/video にあるはず。ファイル名は、ブラウザから epgrec の録画済一覧から該当ファイルをクリックして、ダウンロードされたファイル名を参照すると分かる。
今回は GR22_20110211015500_20110211022500_tss.ts_tmp.ts ファイルを処理する。
windows でのスプリット処理には、TsSplitter を利用する。
「DTV関連ツール」サイトで、左の「メニュー」から「DTV アップローダ」を選択。
表示された右ページ上段の「過去ログ検索」リンクをクリック。
過去ログ検索画面で、「検索文字列」に”TsSplitter”と入力し、「Search/Return」ボタンを押す。
日付が”2009年07/17(金)21:17”のファイル名”up0140.zip”をダウンロードする。
少々古いが、現時点のうちの環境(windows vista 64bit SP2)でも、問題なく動作する。
ひょっとしたら、最新版がどこかにあるのかもしれない。
インストーラは無いので、up0140.zip を適当なディレクトリに解凍したら、インストール完了。
TsSplitterGUI.exe を起動する。
設定は、「HD映像を残す」だけにチェックを入れている。
好みに合わせて設定するヨロシ。
変換ファイルにスプリット処理をしたいファイルを選択して、「変換」ボタンを押すだけ。
変換後のファイルを所定のファイル名に変更する(うちの場合は、GR22_20110211015500_20110211022500_tss.ts とか)
変換後のファイルを、/var/www/epgrec/video ディレクトリにコピーする。
ファイルの所有ユーザとグループを、他の録画済みファイルと合わせておくことを忘れずに。
次に、サムネールを作成する。
ここからは、Ubuntu 上で作業を行う。
ffmpeg -i /var/www/epgrec/video/GR22_20110211015500_20110211022500_tss.ts -r 1 -s 160x90 -ss 130 -vframes 1 -f image2 /var/www/epgrec/thumbs/GR22_20110211015500_20110211022500_tss.ts.jpg
のようにする。ファイル名は、適宜変更すること。-ss オプションで、開始から何秒後の画面をサムネールにするのかを指定している。
実行すると数秒(結構時間がかかる)でサムネール作成完了する。
作成後のサムネールの所有ユーザとグループを変更しておくこと。
付録
[ do-record.sh ] オレオレ仕様版
#!/bin/bash echo "CHANNEL : $CHANNEL" echo "DURATION: $DURATION" echo "OUTPUT : $OUTPUT" echo "TUNER : $TUNER" echo "TYPE : $TYPE" echo "MODE : $MODE" RECORDER=/usr/local/bin/recpt1 SPLIT=/usr/local/bin/tssplitter_lite OUTPUT_TMP=${OUTPUT}_tmp.ts if [ ${MODE} == 0 ]; then $RECORDER --b25 --strip $CHANNEL $DURATION ${OUTPUT} >/dev/null elif [ ${MODE} == 1 ]; then $RECORDER --b25 --strip $CHANNEL $DURATION ${OUTPUT_TMP} >/dev/null if [ ${TYPE} == "BS" ]; then $SPLIT ${OUTPUT_TMP} ${OUTPUT} ${CHANNELL} elif [ ${TYPE} == "GR" ]; then if [ ${CHANNEL} == "27" ]; then # NHK $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1024 elif [ ${CHANNEL} == "26" ]; then # 教育 $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1032 elif [ ${CHANNEL} == "25" ]; then # 日本テレビ $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1040 elif [ ${CHANNEL} == "22" ]; then # TBS $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1048 elif [ ${CHANNEL} == "21" ]; then # フジテレビ $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1056 elif [ ${CHANNEL} == "24" ]; then # テレビ朝日 $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1064 elif [ ${CHANNEL} == "23" ]; then # テレビ東京 $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1072 elif [ ${CHANNEL} == "20" ]; then # Tokyo MX TV $SPLIT ${OUTPUT_TMP} ${OUTPUT} 23608 elif [ ${CHANNEL} == "18" ]; then # テレビ神奈川 $SPLIT ${OUTPUT_TMP} ${OUTPUT} 24632 elif [ ${CHANNEL} == "32" ]; then # テレ玉 $SPLIT ${OUTPUT_TMP} ${OUTPUT} 29752 elif [ ${CHANNEL} == "28" ]; then # 放送大学 # なぜか Segmentation fault が発生するので分割しない # $SPLIT ${OUTPUT_TMP} ${OUTPUT} 1088 mv ${OUTPUT_TMP} ${OUTPUT} exit else exit fi if [ $? == 0 ]; then rm ${OUTPUT_TMP} fi fi fi