ARIB B25復号処理
二ヶ国語音声対応の問題で、録画したTSファイルを調べててARIB STD-B25の復号(descramble)に失敗しているものがある事に気付いた。
gt110bのMB直結&ケース内蔵にしたB-CASカードの接触不良と推察し、手作業でb25コマンドを叩いていたのだが、よく考えたらB-CASカード1枚では同時に復号できるのは3番組が限界なので、4つ以上の番組録画が重なった場合に足りなくなる事が判明。
…かと言って、B-CASカードリーダを2セットも用意するのもバカらしいので、recpt1ではひとまずscramble状態のまま受信しておいて、別途一つずつファイルを順次descrambleするのが賢いと気づいた。
というわけで、/var/www/html/epgrec/do-record.shを弄ってrecpt1の--b25オプションを削除し、/var/www/html/epgrec/config.phpで定義しているepgrec録画ファイルの拡張子を.tsから.arib25に変更。
~~~
$RECORD_MODE = array(
// ※ 0は必須で、変更不可です。
0 => array(
'name' => 'Full TS', // モードの表示名
'suffix' => '.arib25', // ファイル名のサフィックス
),
1 => array(
'name' => 'Minimum TS', // 最小のTS
'suffix' => '.arib25', // ファイル名のサフィックス
),
/* Example is as follows.
2 => array(
'name' => '12Mbps MPEG4',
'suffix' => '.avi',
),
*/
);
~~~
録画完了時に.arib25ファイルを/var/www/html/epgrec/recording(GUI設定値)から/var/www/html/epgrec/recordedに移動するよう/var/www/html/epgrec/recorder.phpも変更。
305 $decodefile = INSTALL_PATH ."/recorded/" . $rrec->path;b25コマンドを回して.arib25から.tsを出力するcronを作成。
306 rename(INSTALL_PATH .$settings->spool . "/". $rrec->path, $decodefile);
307 reclog( "recorder:: 予約ID". $rrec->id .":".$rrec->type.$rrec->channel.$rrec->title."のB25復号準備" );
yano@GT110b:~$ cat ~/etc/cron.sh/b25_descramble.cron
#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
NUM_FILES=5
SRC_SUFFIX=".arib25"
DST_SUFFIX=".ts"
PIDFILE=/home/yano/run/`basename $0`.pid
UUID=`id | sed 's/uid=\([0-9]*\)(.*/\1/'`;
[ $UUID -eq 0 ] && PIDFILE=/var/run/`basename $0`.pid;
if [ -e ${PIDFILE} ];
then
exit;
fi
echo $$ > ${PIDFILE}
trap "/bin/rm -f ${PIDFILE}; exit" 1 2 3 15
B25_CMD="/usr/local/bin/b25"
CONFIGFILE=/etc/default/epgrec
# source config info
[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
cd ${TS_RECORDED};
SRC_FILES=`ls -1 *${SRC_SUFFIX} | head -${NUM_FILES}`
for f in ${SRC_FILES};
do
sudo chown ${OWNER} $f;
chmod 644 $f;
B25_OUT=`basename ${f} ${SRC_SUFFIX}`.${DST_SUFFIX};
${B25_CMD} ${f} ${B25_OUT};
if [ -s ${B25_OUT} ];
then
touch --reference=${f} ${B25_OUT};
mv ${B25_OUT} ${TS_ENCODING}/;
mv ${f} ${TS_RECORDED}/.b25done/;
else
mv ${f} ${TS_ENCODE_FAILED};
fi;
done
if [ -e ${PIDFILE} ];
then
rm -f ${PIDFILE};
fi