mimikakimemo

自分用メモ。

NTP の設定

Chinachu で録画開始のタイミングがズレると思ったら、そういえば NTP の設定をしていなかった。というわけで設定。

$ sudo apt-get install ntp

/etc/ntp.conf の同期先サーバーの設定を変更。

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

ntpd を再起動。

$ sudo service ntp restart

低価格 SSD 「Crucial MX100」を買って LIVA のストレージにした

LIVA の内蔵ストレージ(eMMC)は32GBしかないため、地デジを録画するとたったの数時間分でいっぱいになってしまう。録画したファイルを貯めておけるような NAS は持っていないので、LIVA にストレージを外付けすることにした。

安くて大容量な HDD にしようかとも思ったが、今回は速くて静音な SSD にした。ちょうど先月 Crucial MX100 が発売され、コストパフォーマンスの良さが話題になっていたので、これの 256GB モデル CT256MX100SSD1 を選択。

Crucial MX100 2.5インチ内蔵型SSD 256GB SATAIII CT256MX100SSD1

Crucial MX100 2.5インチ内蔵型SSD 256GB SATAIII CT256MX100SSD1

そのころ(先月半ば)は品薄状態だったこともあり、結局 BUY MORE 秋葉原本店で並行輸入品を購入。並行輸入品の保証期間は10ヶ月だが、その分若干割安で税込10,980円だった。

一緒に、2.5インチ SSD/HDD 外付けケース「黒角MINI OWL-ESL25S/U3(B)」を購入。このケースはアルミ製でちゃちくなく、USB 3.0 に対応している。ヨドバシで1,990円。

このケースに SSD を入れ、LIVA の USB 3.0 ポートに繫いだ。が、LIVA の USB ポートの出力が足りないのか、それだけではうまく動かない。ケースに付属している電源補助ケーブル(2股になったUSB ケーブル)を使い、USB 3.0, USB 2.0 の両ポートに接続すると一応動くが、それでも転送速度がかなり遅くなる。面倒だったので詳しく調べなかったが、USB 2.0 の上限速度(480Mbps)程度になっていた。

これでは使い物にならないため、セルフパワーの USB 3.0 ハブを買ってきてここに外付けケースを接続することにした。セルフパワー USB 3.0 ハブはまだあまり選択肢がないようで、値段がちょっと高い。エレコムの U3H-T403SBK を2,590円で買った。

外付けケース(SSD)―― USB 3.0 ハブ ―― LIVA USB 3.0 ポート という形になり、これでようやく快適に動くようになった。速度も十分出ている。

結局いろいろ買ってしまったが、安定して動いているのでとりあえず満足。

Chinachu + recfsusb2n で "can't send urb: No such file or directory" になってコケる問題

前回記事で LIVA に Chinachu を入れてみたところ、LIVA の起動直後はうまく動いていたが、しばらくすると EGP 取得や録画ができなくなった。Chinachu scheduler のログ(chinachu/log/scheduler)を見てみると、EPG 取得の途中で「recfsusb2n: can't send urb: No such file or directory」というエラーが現れている。

8 Jun 19:35:20 - [4] {"type":"GR","channel":"22","n":4}
8 Jun 19:35:20 - [4] LOCK: FSUSB2 (n=0)
8 Jun 19:35:20 - [4] SPAWN: recfsusb2n -b 22 - - (pid=20909)
8 Jun 19:35:20 - [4] STREAM: /tmp/chinachu-tmp-hw67srds.m2ts
8 Jun 19:35:20 - STATUS: { completed: 6, waiting: 5, worked: 5, running: 1 }
8 Jun 19:35:20 - [4] #recfsusb2n: recfsusb2n ver. 0.9.2 ISDB-T DTV Tuner FSUSB2N device: "/dev/bus/usb/001/005"
8 Jun 19:35:20 - STATUS: { completed: 6, waiting: 4, worked: 5, running: 1 }
8 Jun 19:35:20 - [4] #recfsusb2n: pid = 20909
8 Jun 19:35:21 - [4] #recfsusb2n: B25Decoder initialized.
8 Jun 19:36:20 - [4] UNLOCK: FSUSB2 (n=0)
8 Jun 19:36:20 - [4] EXEC: epgdump (pid=20972)
8 Jun 19:36:21 - UNLINK: /tmp/chinachu-tmp-hw67srds.m2ts
8 Jun 19:36:21 - [4] CHANNEL: GR-22 ... GR_1048 (sid=1048) (programs=214) - TBS1
8 Jun 19:36:21 - [4] CHANNEL: GR-22 ... GR_1049 (sid=1049) (programs=0) - TBS2
8 Jun 19:36:21 - [4] -- (ok)
8 Jun 19:36:22 - [5] {"type":"GR","channel":"23","n":5}
8 Jun 19:36:22 - [5] LOCK: FSUSB2 (n=0)
8 Jun 19:36:22 - [5] SPAWN: recfsusb2n -b 23 - - (pid=20974)
8 Jun 19:36:22 - [5] STREAM: /tmp/chinachu-tmp-hw67u2uw.m2ts
8 Jun 19:36:22 - STATUS: { completed: 7, waiting: 4, worked: 6, running: 1 }
8 Jun 19:36:22 - [5] #recfsusb2n: recfsusb2n ver. 0.9.2 ISDB-T DTV Tuner FSUSB2N device: "/dev/bus/usb/001/005"
8 Jun 19:36:22 - STATUS: { completed: 7, waiting: 3, worked: 6, running: 1 }
8 Jun 19:36:22 - [5] #recfsusb2n: pid = 20974
8 Jun 19:36:22 - [5] #recfsusb2n: B25Decoder initialized.
8 Jun 19:36:29 - [5] #recfsusb2n: recfsusb2n: can't send urb: No such file or directory
8 Jun 19:36:34 - [5] UNLOCK: FSUSB2 (n=0)
8 Jun 19:36:34 - [5] EXEC: epgdump (pid=20996)
8 Jun 19:36:34 - UNLINK: /tmp/chinachu-tmp-hw67u2uw.m2ts
8 Jun 19:36:34 - [5] EPG: データが空 (result.tv.channel is undefined)
8 Jun 19:36:34 - [5] -- (retrying, residue=2)
8 Jun 19:36:37 - [5] {"type":"GR","channel":"23","n":5}
8 Jun 19:36:37 - [5] LOCK: FSUSB2 (n=0)
8 Jun 19:36:37 - [5] SPAWN: recfsusb2n -b 23 - - (pid=20998)
8 Jun 19:36:37 - [5] STREAM: /tmp/chinachu-tmp-hw67uefr.m2ts
8 Jun 19:36:37 - [5] #recfsusb2n: recfsusb2n ver. 0.9.2 ISDB-T DTV Tuner FSUSB2N
8 Jun 19:36:37 - [5] #recfsusb2n: device: "/dev
8 Jun 19:36:37 - [5] #recfsusb2n: /bus/usb/001/005"
8 Jun 19:36:37 - [5] #recfsusb2n: pid = 20998
8 Jun 19:36:37 - [5] #recfsusb2n: B25Decoder initialized.
8 Jun 19:36:44 - [5] #recfsusb2n: recfsusb2n: can't send urb: No such file or directory
8 Jun 19:36:49 - [5] UNLOCK: FSUSB2 (n=0)
8 Jun 19:36:49 - [5] EXEC: epgdump (pid=21014)
8 Jun 19:36:49 - UNLINK: /tmp/chinachu-tmp-hw67uefr.m2ts
8 Jun 19:36:49 - [5] EPG: データが空 (result.tv.channel is undefined)
8 Jun 19:36:49 - [5] -- (retrying, residue=1)
8 Jun 19:36:52 - [5] {"type":"GR","channel":"23","n":5}
8 Jun 19:36:52 - [5] LOCK: FSUSB2 (n=0)
8 Jun 19:36:52 - [5] SPAWN: recfsusb2n -b 23 - - (pid=21016)
8 Jun 19:36:52 - [5] STREAM: /tmp/chinachu-tmp-hw67uq28.m2ts
8 Jun 19:36:52 - [5] #recfsusb2n: recfsusb2n ver. 0.9.2 ISDB-T DTV Tuner FSUSB2N
8 Jun 19:36:52 - [5] #recfsusb2n: device: "/dev/bus/usb/001/005"
8 Jun 19:36:52 - [5] #recfsusb2n: pid = 21016
8 Jun 19:36:52 - [5] #recfsusb2n: B25Decoder initialized.
8 Jun 19:36:59 - [5] #recfsusb2n: recfsusb2n: can't send urb: No such file or directory
8 Jun 19:37:04 - [5] UNLOCK: FSUSB2 (n=0)
8 Jun 19:37:04 - [5] EXEC: epgdump (pid=21033)
8 Jun 19:37:04 - UNLINK: /tmp/chinachu-tmp-hw67uq28.m2ts
8 Jun 19:37:04 - [5] EPG: データが空 (result.tv.channel is undefined)
8 Jun 19:37:04 - [5] -- (give up)

これ以降は、EPG 取得をしても録画をしても(さらに手動で recfdusb2n を起動しても)、同じエラーが出て失敗してしまう。マシンを再起動すれば一旦は直るが、いずれにせよ scheduler を実行しているうちに同じエラーになり、動かなくなる。

Chinachu の問題なのか recfsusb2n の問題なのか、あるいは KTV-FSUSB2 の問題なのか LIVA の問題なのか、いろいろ調べても知識不足でさっぱりわからなかったが、最終的には、chinachu/app-scheduler.js の SIGKILL を SIGTERM に変更したら良さげな感じ。

diff --git a/app-scheduler.js b/app-scheduler.js
index 59d77be..38843cf 100644
--- a/app-scheduler.js
+++ b/app-scheduler.js
@@ -935,7 +935,7 @@ function getEpg() {
 
                                // プロセスタイムアウト
                                execRecCmd(function() {
-                                       recProc.kill('SIGKILL');
+                                       recProc.kill('SIGTERM');
                                }, 1000 * (config.schedulerEpgRecordTime || 60), '[' + i + '] KILLWAIT');
 
                                // キャンセル時
@@ -943,7 +943,7 @@ function getEpg() {
                                var onCancel = function () {
 
                                        isCancelled = true;
-                                       recProc.kill('SIGKILL');
+                                       recProc.kill('SIGTERM');
                                };
 
                                removeListeners = function () {

とりあえず、しばらくこれで様子を見てみたい。

KEIAN USB地デジ&ワンセグチューナー KTV-FSUSB2/V3

KEIAN USB地デジ&ワンセグチューナー KTV-FSUSB2/V3

LIVA に Chinachu を導入して録画サーバーにする

今までは、鼻毛鯖に epgrec を入れて録画サーバーにしていた。先日、超小型の低価格 PC である ECS LIVA を買ったので、以前から気になっていた録画予約システム Chinachu を入れてみる。環境は以下のとおり。

マシン ECS LIVA-B3-2G-32G
OS Ubuntu 14.04 Desktop 日本語Remix 64bit
チューナー 恵安 KTV-FSUSB2
録画コマンド recfsusb2n for linux v0.9.2(パッチ適用済み)

recfsusb2n の導入については前回の記事を参照。

KEIAN USB地デジ&ワンセグチューナー KTV-FSUSB2/V3

KEIAN USB地デジ&ワンセグチューナー KTV-FSUSB2/V3

Chinachu のインストール

以下、公式ドキュメントの指示に従ってインストールしていく。

依存パッケージのインストール

$ sudo apt-get install build-essential curl git-core libssl-dev yasm libtool autoconf libboost-all-dev

Chinachu 本体のインストール

GitHub 上のリポジトリをクローンし、インストーラを実行する。

$ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
$ cd ~/chinachu/
$ ./chinachu installer
Chinachu Installer Menu:
[!] These are installed under all /home/*****/chinachu/...
[!] Recommend the Auto installation. 
1) Auto (full)            5) Node.js Modules       9) libfdk-aac
2) Auto (fast)            6) epgdump              10) libogg
3) submodule              7) libx264              11) libvorbis
4) Node.js Environment    8) libvpx               12) libav
what do you install? > 1

1 の Auto (full) を選べば、必要なものをすべて自動でインストールしてくれる。いろいろコンパイルするので、LIVA では10分強かかった。

設定

設定ファイル config.json の編集

設定ファイルのサンプル config.sample.json が chinachu のルート直下にあるので、これをコピーして使う。

$ cp config.sample.json config.json

config.json の内容は以下のようにした。

{
  "recordedDir" : "./recorded/",
  "temporaryDir": "/tmp/",

  "wuiUsers": [
    "akari:bakuhatsu"
  ],

  "wuiPort"        : 10772,
  "wuiHost"        : "::",
  "wuiTlsKeyPath"  : null,
  "wuiTlsCertPath" : null,
  "wuiOpenServer"  : false,
  "wuiOpenPort"    : 20772,
  "wuiPreviewer"   : true,
  "wuiStreamer"    : true,
  "wuiFiler"       : true,
  "wuiConfigurator": true,

  "recordedFormat": "<date:yymmdd-HHMM>_<type><channel>_<title>.m2ts",

  "tuners": [
    {
      "name"        : "FSUSB2",
      "isScrambling": false,
      "types"       : [ "GR" ],
      "command"     : "recfsusb2n -b <channel> - -"
    }
  ],

  "channels": [
    { "type": "GR", "channel": "27" },
    { "type": "GR", "channel": "26" },
    { "type": "GR", "channel": "25" },
    { "type": "GR", "channel": "24" },
    { "type": "GR", "channel": "22" },
    { "type": "GR", "channel": "23" },
    { "type": "GR", "channel": "21" },
    { "type": "GR", "channel": "20" },
    { "type": "GR", "channel": "28" }
  ]
}

サンプルには tuners に PT3 の設定も入っているが、今回は FSUSB2 だけなので消しておく。channels には、受信したい物理チャンネルを列挙する。

Chinachu の番組表におけるチャンネルの並び順は、この channels に書かれた順序になる。

なお、valid な JSON になっていないと、Chinachu を動かしたときにエラーが出る。コメントや末尾のカンマは許容されないので注意。

空の録画予約ルールの作成

$ echo "[]" > rules.json

動作チェック

Web UI の動作確認

$ ./chinachu service wui execute

ブラウザで http://localhost:10772/ が開けるか確認。config.json の wuiUsers で指定したユーザー名/パスワード(初期設定では akari/bakuhatsu)を入力して中に入る。

この段階ではまだ EPG のデータを取得していないので、番組表は表示されない。WUI がちゃんと起動できていたら Ctrl+\ で終了させる。

EPG の取得テスト

EPG(番組表のデータ)を取得してみる。1チャンネルにつき1分程度要した。

$ ./chinachu update -f

なお、最初は下のようなエラーが出たが、これは config.json の command にタイポがあった(recfsusb2n が .recfsusb2n になっていた)というだけだった。

8 Jun 00:44:50 - GETTING EPG.
8 Jun 00:44:50 - [0] {"type":"GR","channel":"20","n":0}
8 Jun 00:44:50 - [0] LOCK: FSUSB2 (n=0)
8 Jun 00:44:50 - [0] SPAWN: .recfsusb2n -b 27 - - (pid=22521)
8 Jun 00:44:50 - [0] STREAM: /tmp/chinachu-tmp-hw53ex34.m2ts
8 Jun 00:44:50 - STATUS: { completed: 0, waiting: 9, worked: 1, running: 1 }

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:988:11)
    at Process.ChildProcess._handle.onexit (child_process.js:779:34)

サービスの登録

Chinachu のサービス(chinachu-operator と chinachu-wui)が自動的に起動するよう、システムに登録する。

まず、起動スクリプトを /etc/init.d/ に追加する。

$ ./chinachu service operator initscript > /tmp/chinachu-operator
$ ./chinachu service wui initscript > /tmp/chinachu-wui
$ sudo chown root:root /tmp/chinachu-operator /tmp/chinachu-wui
$ sudo chmod +x /tmp/chinachu-operator /tmp/chinachu-wui
$ sudo mv /tmp/chinachu-operator /tmp/chinachu-wui /etc/init.d/

次に、insserv でサービスを登録する。ただし、Ubuntu のデフォルトの状態では、

$ sudo insserv chinachu-operator
sudo: insserv: command not found

となって使えない。insserv は /usr/lib/insserv/ に入っているので、シンボリックリンクを張ってから実行する。

$ sudo ln -s /usr/lib/insserv/insserv /sbin/insserv
$ sudo insserv chinachu-operator
$ sudo insserv chinachu-wui

サービスの開始

$ sudo service chinachu-operator start
$ sudo service chinachu-wui start

これで Chinachu が起動する。先ほどと同様、http://localhost:10772/ にアクセスすれば WUI が動いているはず。

Chinachu のログは chinachu/log/ 以下に保存されるので、うまく動いていない場合にはこれを参照する。WUI の ダッシュボード > ログ からでも閲覧可能(しかも自動的に表示を更新してくれる)。

なお、最初は(chinachu/log/operator に)以下のようなエラーが出て、うまく録画できなかった。

uncaughtException: Error: spawn ENOENT
    at errnoException (child_process.js:988:11)
    at Process.ChildProcess._handle.onexit (child_process.js:779:34)
8 Jun 03:04:55 - #recfsusb2n: execvp(): No such file or directory

どうやら、.zshrc で追加した PATH の中に recfsusb2n を入れていたため、./chinachu update -f などを手動で実行することはできても、Chinachu のサービスが recfsusb2n を動かそうとしたときには見つけられず、エラーになっていたっぽい。recfsusb2n を /usr/local/bin/ に移動したら解消された。

WUI からの設定の変更

Chinachu 設定ファイル config.json は、WUI が動いていれば右上の「+設定」から編集することができる。ハイライトや文法チェックもリアルタイムで行なってくれる。編集内容によっては、保存後に

$ sudo service chinachu-operator restart

(あるいは chinachu-wui)でサービスを再起動しないと反映されない。

まとめ

というわけで、LIVA への Chinachu の導入をひととおり行なった。鼻毛鯖に epgrec を入れたときには、MySQLパーミッションの設定などいろいろ面倒だったような記憶があるが、Chinachu はわりと簡単にできた。まだ使い始めたばかりだけども、UI も作りこまれていて使いやすそう。epgrec の開発が止まっていることもあり、夏アニメが始まる頃までには Chinachu に乗り換えていきたい。

エンコードとなると LIVA では厳しいかもしれないが、普通に Chinachu を動かす分には十分な感じだった。あとは TS ファイルの保存先をどうしようか。それほど録り溜めるつもりはないものの、LIVA に組み込まれているストレージ(eMMC)は 32GB だけなので、なにか考える必要がある。

次回は LAN 内の他の PC から録画・視聴ができるよう、環境を整備していきたい。

LIVA と KTV-FSUSB2 で地デジをみる

鼻毛鯖で使っている USB 地デジチューナー KTV-FSUSB2 を ECS LIVA にくっつけて、視聴・録画を試してみた。OS は Ubuntu 14.04 Desktop。

KEIAN USB地デジ&ワンセグチューナー KTV-FSUSB2/V3

KEIAN USB地デジ&ワンセグチューナー KTV-FSUSB2/V3

チューナーの接続

以前鼻毛鯖で設定した時と同様。

まず USB に接続していない状態で、使用するユーザーを video グループに追加する。

$ sudo gpasswd -a ユーザー名 video

グループの追加を反映させるため、一度ログアウトしてからログイン。

次に /lib/udev/rules.d/89-tuner.rules を以下の内容で作成。

# FSUSB2N
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0029", MODE="0664", GROUP="video"

そしてチューナーを接続し、認識されているか確認。

$ lsusb -d 0511:
Bus 002 Device 003: ID 0511:0029 N'Able (DataBook) Technologies, Inc.

recfsusb2n のビルド

以下の記事を参考にした。

ソースのダウンロード

recfsusb2n for linux のソース本体を下のリポジトリから取ってくる。2012年11月26日以降は更新されていない。バージョンは 0.9.2。

次に、下のブログから tssplitter_lite と HTTP サーバを内蔵させるパッチをダウンロード。最新は2012年5月30日の記事のもの。

パッチの適用

パッチのアーカイブ recfsusb2n_http_patch2.zip を展開すると中身は以下のようになっている。

recfsusb2n_http_patch2
├── Makefile
├── decoder.h
├── fsusb2n.cpp
├── readme_patch.txt
├── tssplitter_lite.cpp
└── tssplitter_lite.h

これら中身のファイルをすべて recfsusb2n/src/ 内に(上書き)コピーする。

make

上のリポジトリの状態では cmake を使ってビルドするようになっているが、パッチの中に Makefile がついているので、今回はこれを使う。

自分のLIVA+Ubuntu では、以下のように src/Makefile を1行修正する必要があった(-lboost_thread-mt ではない)。

LIBS   = -lpthread -lboost_system -lboost_thread -lboost_filesystem

書き換えて make すれば、src/ 内に recfsusb2n という実行ファイルができあがる。

$ sudo apt-get install libboost-thread-dev libboost-filesystem-dev
$ cd src
$ make

視聴する

引数なしで実行するとヘルプが表示される。

$ ./recfsusb2n
usage:
./recfsusb2n [--b25] [-v] [--sid n1,n2,...] [--wait n] channel recsec destfile

Remarks:
if rectime  is '-', records indefinitely.
if destfile is '-', stdout is used for output.

http broadcasting mode:
./recfsusb2n --http portnumber [--b25] [-v] [--sid n1,n2,...] [--wait n]

Options:
--b25:              Decrypt using BCAS card
-v:
--sid n1,n2,...:    Specify SID number or keywords(all,hd,sd1,sd2,sd3,1seg,epg) in CSV format
--http portnumber:  Turn on http broadcasting (run as a daemon)
--wait n:           Wait insert before of recording (1=100mSec)

録画テスト

テストのため、TS ファイルを30秒間だけ録画してみる。チャンネルの27はNHK総合(東京)。

$ ./recfsusb2n --b25 -v 27 30 test.ts

test.ts を VLC で再生してみたらちゃんと録画できていた。成功。

確認が終わったら、recfsusb2n をパスの通っているところ(/usr/local/bin)に入れておく。

内蔵 HTTP サーバを使ってテレビを視聴する

--http オプションを指定すると、HTTP サーバとなるデーモンが立ち上がる。

$ recfsusb2n --b25 -v --http 8888
creating a http daemon
recfsusb2n ver. 0.9.2
ISDB-T DTV Tuner FSUSB2N
device: "/dev/bus/usb/001/003"
run as a daemon..
listening at port 8888
pid = 3475

VLC からこれにアクセスすれば、好きなチャンネルの放送を視聴することができる。たとえば、27chなら次のようにする。

$ vlc http://localhost:8888/27

なお、あらかじめ以下のようなテキストファイルを tv.m3u などとして作成しておき、これを VLC にプレイリストとして読み込ませれば、GUI からのチャンネル変更が容易になる。

#EXTM3U
#EXTINF:0,NHK 総合
http://localhost:8888/27
#EXTINF:0,NHK Eテレ
http://localhost:8888/26
#EXTINF:0,日本テレビ
http://localhost:8888/25
#EXTINF:0,テレビ朝日
http://localhost:8888/24
#EXTINF:0,TBS
http://localhost:8888/22
#EXTINF:0,テレビ東京
http://localhost:8888/23
#EXTINF:0,フジテレビ
http://localhost:8888/21
#EXTINF:0,東京MX
http://localhost:8888/20
#EXTINF:0,放送大学
http://localhost:8888/28


というわけで、LIVA でも普通に地デジの試聴ができた。次は録画予約システム Chinachu を導入してみたい。