2011年2月26日土曜日

epgrec で録画ファイルのスプリットに失敗した場合の復旧方法

うちの epgrec 録画環境(Ubuntu)で、結構頻繁に録画後のスプリット処理が失敗していることがある。(サムネールが録画一覧画面に表示されない)
スプリットが失敗したファイルを、そのまま利用すれば問題ないのだが、手動でリカバリ作業をしたくなるときもある。その手順を備忘録として残しておく。

この作業を行うためには以下のような前提がある。
  • スクランブル解除処理は成功していること。(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