スプリットが失敗したファイルを、そのまま利用すれば問題ないのだが、手動でリカバリ作業をしたくなるときもある。その手順を備忘録として残しておく。
この作業を行うためには以下のような前提がある。
- スクランブル解除処理は成功していること。(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
