録画サーバ構築 epgrec UNA+mirakurun環境 epgrec改造編

epgrec UNA + mirakurun の組み合わせで動作させるために、前回mirakurunの調整を行った。チューナーの利用元はepgrec側に統一したいので、mirakurun側での操作を止めることが目的だった。今回はepgrec側でのチューナー操作をrecpt1からrivarunに変更して、別サーバ上のmirakurunでも録画できるようにする。ちょっとややこしいけど、ローカル2本のチューナーとリモート2本のチューナーを透過的に扱う。具体的にはmirakurunのtuners.ymlを以下のように用意する。

アースソフト★地デジチューナーカード PT3 Rev.A★
価格 : 31,800円(税込、送料無料)
by Yahoo! ショッピング

- name: PT3-T1
  types:
    - GR
  command: recpt1 --device /dev/pt3video2 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT3-T2
  types:
    - GR
  command: recpt1 --device /dev/pt3video3 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT3-T3
  types:
    - GR
  command: rivarun --ch GR/<channel> --mirakurun server2:40772 - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT3-T4
  types:
    - GR
  command: rivarun --ch GR/<channel> --mirakurun server2:40772 - -
  decoder: arib-b25-stream-test
  isDisabled: false

録画処理用のコマンドをそっくり入れ替えるんだけど、録画だけで言えばdo-record.shを使えばよいのかもしれない。しかし、私の場合は全面的にrivarunに入れ替えてしまいたいので、変更対象は番組表更新なども含まれる。リソース管理をmirakurunで一元化するためにも全てrivarunで処理したい。どうせ番組表のところはコード修正になるので、録画のところも直接コードを修正してしまう。既に録画データの出し分けなど、好き勝手に修正しているので悩む必要もなかった。

今までの経験とgrepした結果で、修正対象は以下のもの。

  • 録画処理本体のReservation.class.php
  • 番組表更新のairwavesSheep.php
  • 録画時や番組表更新時に動作するrepairEpg.phpとscoutEpg.php
  • 共有ライブラリのreclib.php

録画処理やEPG関連の変更は、がっつり書き換えてしまえばそれほど難しくない。以下、参考までに。

vi Reservation.class.php
    :
$cmd_ts   = '/usr/bin/rivarun '.$slc_cmd['b25'].$device.$sid.' --ch '.$smf_type.'/'.$crec_->channel.' '.$duration.' \''.$add_dir.$filename.'\' >/dev/null 2>&1'.$falldely;

vi airwavesSheep.php
    :
$cmd_ts   = '/usr/bin/rivarun '.$rec_cmds[$cmd_num]['b25'].' --ch '.$type.'/'.$value.' '.$rec_time.' '.$temp_ts.$falldely;

vi repairEpg.php
    :
$cmdline  = '/usr/bin/rivarun '.$rec_cmds[$cmd_num]['b25'].' --ch '.$type.'/'.$value.' '.$rec_tm.' '.$temp_ts.$falldely;

vi scoutEpg.php
    :
$cmdline  = '/usr/bin/rivarun '.$rec_cmds[$cmd_num]['b25'].' --ch '.$type.'/'.$value.' '.$rec_tm.' '.$temp_ts.$falldely;

これで基本的なチューナー処理系は全てrivarun経由に変更できて、recpt1を直接触ることはなくなった。嬉々として普通に使ってみていると実はキャンセル処理ができない。動作確認のために簡易予約してキャンセルみたいなことを繰り返すので、キャンセルがきちんとできないと検証効率が非常に悪くなってしまう。そもそも以前は動いていた処理が動作しないというのも気分悪いし。という訳で、コードを読み進めると、ここでreclib.phpの中にある$catch_cmdの意味がやっと理解できる。

cancel()処理そのものは、Reservation.class.phpの最後の方に定義されていて、停止対象のプロセスを探す処理だけがreclib.phpの方に切り出されている。元々は/tmp/tuner_xxxxファイルにあるpidで停止するのだが、これがrivarunの起動元となる/bin/bashプロセスになってしまうため、rivarunプロセスが生き残ってしまう。仕方がないので、$catch_cmdと一致するプロセスを見つけて、そのpidを返すような作りに修正した。本来であれば、tuner_xxxxファイルが存在しないとき用の処理なんだけどね。

vi reclib.php
    :
$catch_cmd  = '/usr/bin/rivarun'.$slc_cmd['b25'].( $device!=='' ? $device : $sid.' --ch '.$type.'/'.$prev_recs[0]['channel'].' ' );
    :
if( strpos( $cc, $catch_cmd )!==FALSE )
    return $ps;

この変更を加えてもキャンセル処理はまだ動かない。Reservation.class.phpをもう1度見てみる。どうやらプロセス停止処理がrecpt1ctlコマンドで行われているようだ。recpt1ctlコマンドがなければkillされるので、分岐処理を都合よく変更してしまうか、recpt1ctlコマンドをどけてしまうか。これでキャンセル処理も普通に動くようになって検証も捗る。次回は処理時間的に不満の大きいエンコード処理を改善したい。事後処理でエンコードすると録画後すぐに見ることができない。このストレスを解消するために録画と並行してリアルタイム・エンコードを行う。お楽しみに!

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)