ラベル epgrec の投稿を表示しています。 すべての投稿を表示
ラベル epgrec の投稿を表示しています。 すべての投稿を表示

2012/06/01

wavecastでepgrec構築 視聴編

wavecast上でepgrec動いたので、やっぱり外からアクセスして観てみたいわけです

外からepgrecページヘアクセス

http://wavecast.tv/01/でいつものように自分のwavecastにログインして
http://(ip-address)/wave/・・・ってなるので
http://(ip-address)/epgrec にURL変更してepgrecページを表示。おぉ。出た出た。


録画済一覧ページが・・・

あらら。サムネイルがちゃんとでない。
HTMLソースを見ると・・・なるほど、ローカルIPアドレスからのURLになっている。
デフォルトのままなら「http://localhost/epgrec」かな。これでは外アクセスには不都合なので、何処かを直さなくては。
と、初めは考えてSettings.class.phpのfactory()関数で、return $obj;の直前で
$obj->install_url = "http://".$_SERVER["SERVER_NAME"]."/epgrec";
ってやれば、その時点でIPアドレスになっていいかと。実際これでもいけるけど、
せっかく設定できるようになっているのに"/epgrec"が決め打ちなのはどうなの?と思い直して、、、はたと気づいたよ。

epgrecのシステム設定で、インストールURLのところを、"/epgrec"だけにすればいいじゃん。後はブラウザが適当に補完してくれる。URLって言葉に惑わされておりました。

HTML5対応

epgrecでの視聴はasf(asx?)フォームを出力するようになっていて、PCでVLCプレイヤーとかで見るように書かれているみたいだが、wavecast同様、どんなプラットフォームでも視聴したいので、ここはちょっ手を加えてHTML5のvideoタグでの再生に対応させる。

viewer.php (再生スクリプト)を直接書き換えればいいんだろうけど、元ソースをできるだけいじりたくないので、別ファイルに。

viewer_html5.phpというファイルを作成して、再生時にこっちが使われるように
recordedTbl.php (録画一覧スクリプト)ないで、
$arr['asf'] = "".$settings->install_url."/viewer.php?reserve_id=".$r->id;

$arr['asf'] = "".$settings->install_url."/viewer_html5.php?reserve_id=".$r->id;
と書き換える。
これでサムネイルとかクリックするとviewer_html5.phpの方が使わる。
viewer_html5.php の中身は一応こんな感じ。
<?php
//「セッションの有効期限をプライベートに調整する」ってことらしい
ini_set('session.cache_limiter', 'private');
session_start();


//キャッシュを無効
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


include_once("config.php");
include_once(INSTALL_PATH . "/DBRecord.class.php" );
include_once(INSTALL_PATH . "/Settings.class.php" );


$settings = Settings::factory();


if( ! isset( $_GET['reserve_id'] )) jdialog("予約番号が指定されていません", "recordedTable.php");
$reserve_id = $_GET['reserve_id'];


try{
$rrec = new DBRecord( RESERVE_TBL, "id", $reserve_id );
$src = $settings->install_url.$settings->spool."/".$rrec->path;
//$src = "/epgrec".$settings->spool."/".$rrec->path;
}
catch(exception $e ) {
exit( $e->getMessage() );
}
?>


<!doctype html>
<html lang="ja">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body style="padding: 0px; margin: 0px; background-color: black;" >
    <div style="vertical-align:middle;">
      <video src="<?php print $src ?>" width="100%" preload="none" autoplay autobuffer controls onclick="this.play();"/>
    </div>
  </body>
</html>

これで手持ちのデバイスから視聴が出来るようになりました!

しかし残念ながら、iOSとAndroidではオートプレイが効きませんな。色んなサイトの記事で書かれている方法を幾つか試してみたんだけどダメ。wavecastからは出来てるんだけどなぁ。この辺はもう少し勉強して試行錯誤するか。
それに結果的に一番良く使っているiPodTouch初代では見れない。対応させたソース設定とか必要なんだろうね。この辺も改良の余地あり。

WAVECASTメニューに統合

冒頭に書いた、http://(my-global-ip)/epgrec にURL変更してepgrecページを表示って手順を踏むのがとても面倒なのでWAVECASTメニューページからepgrecのページヘ飛ぶボタンを付けてみた。

/home/wave/wave/jp/menu.php に、以下の記述を追加しました。
具体的には、<div class="info">・・・</div>の後。
<div class="toolbar">
  <h1>EPGREC メニュー</h1>
</div>
<table bgcolor=black width=100%>
  <tr>
    <td><ul class=edgetoedge><li><a href=../../epgrec/recordedTable.php rel=external>録画リスト</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/reservationTable.php rel=external>予約リスト</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/programTable.php rel=external>番組検索</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec rel=external>番組表</a></td>
  <tr>
    <td><ul class=edgetoedge><li><a href=../../epgrec/keywordTable.php rel=external>自動登録</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/envSetting.php rel=external>環境設定</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/systemSetting.php rel=external>システム設定</a></td>
    <td><ul class=edgetoedge><li><a href=../../epgrec/logViewer.php rel=external>動作ログ</a></td>
</table>

menu.phpからの相対パス(../../epgrec)でいける。
rel=externalを付けないと、AndroidやiOSだと飛んでくれないんだね。変な感じ。そういうことならと思って、target="_blank"ってやってみたら、いけるんだけど、今度はPCのブラウザだと別ページになっちゃう。なるほど、そういう事か。

wavecastのページはjQTouchで構成されているので、div,ul,liのclass指定で簡単にデザインを変更できて良い感じ。

2012/05/30

wavecastでepgrec構築 録画編

wavecastで、epgrecが動くようにはなったけど、使えるようにするには、いくつか工程を踏むことになったので、その辺を書き記しておきます。

do-record.sh 作成
録画処理は全部ここで行うということで、各モードに対応した録画、エンコード処理を記述していくわけですが、wavecastで行なっている処理を周到しようと思って、試行錯誤の末、以下のような感じになりました。
#!/bin/bash
echo "CHANNEL : $CHANNEL"
echo "DURATION: $DURATION"
echo "OUTPUT : $OUTPUT"
echo "TUNER : $TUNER"
echo "TYPE : $TYPE"
echo "MODE : $MODE"

REC=`echo $(tempfile)|sed s/^.*[/]//`

echo "RECORDING : $REC"

# Record
if [ "$DURATION" ]; then
/home/wave/bin/tsrec2 --b25 $CHANNEL $DURATION /tmp/${REC}.ts 0
fi

# MODE==0
if [ $MODE -eq 0 ]; then
mv /tmp/${REC}.ts $OUTPUT
fi

# HD-TS
if [ $MODE -ge 1 ]; then
/usr/bin/wine tssplit2 -SD2 -SD3 -1SEG -OUT /tmp -BUFF 64 /tmp/${REC}.ts
# MODE==1
if [ $MODE -eq 1 ]; then
mv /tmp/${REC}_HD.ts $OUTPUT
fi
fi

# MP4
if [ $MODE -ge 2 ]; then
/usr/bin/wine tsdemux2 -i 'Z:\tmp\'${REC}_HD.ts -o 'Z:\tmp\'$REC -encode "Demux(m2v+wav)" -sound 0 -nd -start -quit
# /usr/bin/wine bontsdemux -i 'Z:\tmp\'${REC}_HD.ts -o 'Z:\tmp\'$REC -encode "Demux(m2v+wav)" -sound 0 -nd -start -quit

/usr/local/bin/ffmpeg -y -i /tmp/${REC}.m2v -threads 4 -vcodec libx264 -fpre /home/wave/.ffmpeg/ibento7.ffpreset -b 1800k -s 960x540 -aspect 16:9 -an -f mp4 /tmp/${REC}.264

/usr/bin/sox /tmp/${REC}.wav /tmp/${REC}-d.wav delay 0.2 0.2

/usr/local/bin/ffmpeg -y -i /tmp/${REC}.264 -threads 4 -vcodec copy -i /tmp/${REC}-d.wav -acodec libfaac -ac 2 -ar 48000 -ab 128k -vsync 1 /tmp/${REC}.mp4

/usr/bin/MP4Box -ipod -inter 500 /tmp/${REC}.mp4 -out $OUTPUT

/home/wave/bin/copy-to-itunes $OUTPUT
fi

# Mobile
if [ $MODE -eq 3 ]; then
/home/wave/bin/ipod-m4v $OUTPUT
fi

# Cleanup first!
rm /tmp/${REC}*

  1. tsrec2で一旦/tmpに録画
  2. モード0:TSファイルをそのまま保存
  3. モード1:HDTSファイルを作成保存
  4. モード2:H264にエンコードして保存
  5. モード3:MPEG4に再エンコードして保存 
  6. ワーク用tmpファイル削除
って感じです。モードごとに独立してなくて、何処までやるかって処理になってます。

tssplit2とtsdemux2
この2つのアップリはWindowsアプリなので、wineで実行できるようにする必要があります。
/root/.wine/drive_c/windows/system32 からこの2つのexeを/home/wave/.wine/drive_c/windows/system32へコピーします。

ffmpeg
-vpre ibento7だと、/home/wave/.ffmpeg/ibento7.ffpreset があっても見に行ってくれないようなので、直接指定で -fpre /home/wave/.ffmpeg/ibento7 って書きました。

soxで微調整
wavecastのエンコード手順はそれなりにいいと思うんですが、録画したものを視聴してみていると、どうも若干音がずれている気がしまして sox を使用して微調整してみました。自分的には合うようになったなと思ってます。本気の人は、編集ソフトとかで絵と音波形を見比べてみるんでしょうけど、私はフィーリングが合えばいいんです。soxは入ってなかったので
$ sudo apt-get install sox
で入れます。

/home/wave/bin/copy-to-itunes $OUTPUT
以前にも書いたiTunesへ自動登録するスクリプトを実行しているところです。気にしないで。

/home/wave/bin/ipod-m4v $OUTPUT
以前にも書いた初代ipod-touchで再生するファイル作成スクリプトです。気にしないで。

この当たりはまだ思ったような結果にならないんですが、今ん処こんな感じですかね。
次回は視聴編です。

2012/05/28

wavecast-01にepgrec入れてみた

wavecastに epgrec 入れてみました。なかなかいい感じです。

必要な環境は既に入っているので、セットアップに必要な作業は少なくて済みました。
動かすまでにやったことを書き記しておきます。

pegrecサイトのインストール前準備を参考に、環境整備

以下の作業は全部waveユーザで行なっています。root絡みはsudoで実行です。

/root/task/epgdump を/usr/local/binにコピー/root/task/ffmpeg を/usr/local/bin にコピー
/root/task/tsrec2 を /home/wave/bin にコピー (中身はrecfsusb2nのようです)
全部/usr/local/binでもいいけど、terec2はデバイス依存ツールなので分けました。

/etc/at.deny/www-dataを削除とあるが、wavecastでは、apacheがwaveユーザで動いているので削除せず。逆に、waveユーザでatが実行できるように、/etc/at.allowにwaveを追加。

/root以下は一般ユーザからはアクセス出来ないようになっているので、
sudoで実行するか、一度パーミッションをゆるゆるにしてから行う感じでしょうか。
自分は後者でした。作業後はパーミッションを元に戻しておきましょう。

epgrecインストール

pegrec-2010322.tar.gz をダウンロードして、/home/wave/epgrec に展開する
$ sudo ln -s /opt/lampp/htdocs/epgrec /home/wave/epgrec
で、/epgrecでWEBアクセスできるようにする。

以下のサブディレクトリのパーミッションを設定する
$ sudo chmod 777 cache template_c video thumbs settings
config.php.sample => config.php にコピーして受信可能なチャンネルだけにする。
do_record.sh.sample をひな形に適当に do_record.sh を作成する。
テスト中の録画コマンドは、
/home/wave/bin/tsrec2 --b25 $CHANNEL $DURATION $OUTPUT 0
だけでいいんじゃないかな。
$ CHANNEL=27 DURATION=10 OUTPUT=/home/wave/epgrec/video/TEST.ts do_record.sh
ってやって録画されることを確認する。

epgrecセットアップ

http://(wave-cast-url)/epgrec へアクセス。WEBベースのセットアップが始まる。
  • step1
    • ディレクトリパーミッションチェック。OK。
  • step2
    • MySQLデータベースを新たに作るのは面倒なので既存のものを設定
    • ここに直接書くのはいかがなものかと思うので・・・
    • /root/task/vidchlget3.py などを参照して、MySQLdb.connect()のところから、user,passwd,dbを設定する
    • その他、保存先、プログラムパスなどを適当に設定
  • step3
    • チューナ設定。適当に設定。
  • step4
    • 確認ページ。間違ってなければ次へ
  • step5
    • EPG初回番組表取得 getepg.phpが実行される


getepg.php 失敗

ここまで順調だったが、ここでつまずいた。スクリプトがphpを /usr/bin/php にあると期待しているが、wavecastは、xamppでセットアップされているので /opt/lampp/以下に入っている。
$ sudo ln -s /opt/lampp/bin/php /usr/bin/php
でリンクして実行できるようにした。

phpスクリプト内のパスを/opt/lampp/bin/php に変更してみたが、セグメントフォールトになった。
php5をインストールして実行してみたが、(多分mysqlの設定絡みで)正常に動かなかった。
このような対処は後々面倒なのでやめよう。

これでEPGRECのWEBページが出ました。

cronの設定

最後に、ドキュメント通りの手順で、epgrec/cron.d/getepg 内の記述を
0 5 * * *   wave        /home/wave/epgrec/getepg.php
に書き換えて/etc/cron.dにコピー。getepg.phpをwaveユーザ権限で毎日5時に実行ってこと。

稼働!

一応、これだけで最低限の動作は確認出来ました。epgrec いいですね。感謝!
次回は、実際の運用で色々手を加えたことを書いてみようと思います。