KVM上のUbuntuでMirakurun+EPGStationで録画サーバーを構築する
自宅サーバーで録画サーバーを構築したいと思い構築した.その記録を他の人にも参考になるかもしれないので記事にする.
環境は以下.
ホストOS | Ubuntu 18.04.5 LTS |
---|---|
ゲストOS | Ubuntu 18.04.5 LTS |
用意した機材
録画を行うためには以下の機材が必要になる.
選ぶ機材にもよるが,私の場合には8000円ほどですべての機材が調達できた.
B-CASカード
自宅の使われていないテレビから拝借した.ない場合でも,B-CASを発行している会社にお布施をすればもらえるらしい.
テレビチューナー
今回はUbuntuで構築するため,Ubuntuでの動作報告がされているものを選ぶと良い.
その他にも,同時録画可能数や,BS/CSの録画機能の有無などで判断する.
私は地デジで十分であり,同時録画数にもこだわらないため,安価であり,ubuntuでの動作報告が多いPLEX社のPS-S1UD Ver2を購入した.
仕様 | |
---|---|
同時録画数 | 1 |
録画可能チャンネル | 地デジのみ |
接続 | USB |
PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0
- 発売日: 2015/09/10
- メディア: エレクトロニクス
B-CASカードリーダー
Ubuntuでの動作報告がされており,安価なものを選ぶ.
今回はSCM MicrosystemsのSCR3310/v2.0を使用する.
SCM ICカードリーダー/ライター B-CAS・住基カード対応 SCR3310/v2.0 【簡易パッケージ品】
- メディア: エレクトロニクス
テレビ線
一人暮らしだったら適当にテレビ線をつなげれば良いが,実家住まいであるため,家族の見るテレビにつながるテレビ線を引っこ抜くわけにはいかない.
そのため,分配器やテレビ線を別途購入した.
仮想マシンの作成
ホストマシン上で仮想マシンを作成し,sshができるようにする.
IPアドレスは固定にしておくのが望ましい.ファイアウォールはローカル以外からのアクセスはすべて遮断するようにする. これは,セキュリティ面もあるが,録画の公開等グレーな行為になりかねないので自宅利用以外はできないようにするためである.
基本的な設定については本記事では述べないが,このままではチューナーとカードリーダーがゲストOSから読み込めないのでUSBパススルーを設定する必要がある.
USBパススルー
USBパススルーとは,本来ならホストOSに繋がっているUSB機器をゲストOSに繋がっているように見せることである.これを行うことで,B-CASカードの読み取りや,チューナーを介した録画をゲストOSで行うことができる.
まずは,ホストOS上で,パススルーしたい機器の情報を調べる.機器を付け外しして,その前後のlsusbの結果を見れば良い.
$ lsusb Bus 001 Device 003: ID 3275:0080 VidzMedia Pte Ltd Bus 004 Device 002: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
IDのところのXXXX:YYYYとなっているところがそれぞれベンダーと製品IDを指すので控えておく.
次にvirshコマンドを使って,パススルーの設定をする.
virsh shutdown {仮想マシン名} #念の為ゲストOSはシャットダウンしておく virsh edit {仮想マシン名}
すると,エディタが立ち上がるので,devices以下に,下のように追記する.
<hostdev mode='subsystem' type='usb' managed='no'> <source> <vendor id='0xXXXX'/> <product id='0xYYYY'/> </source> </hostdev>
ここで,XXXX,YYYYは先程控えたものに置き換える.
今回のように2つの機器をパススルーする場合には,hostdevノード自体も2つ書く必要がある.
virsh start {仮想マシン名} #正常に開始されることを確認する ssh {仮想マシンのIPアドレス} lsusb
ゲストOSにログインし,lsusbした結果,パススルーを行った機器が見えていれば成功である.
以降の操作は基本的にゲストOSで行うこととする.
B-CASカードの読み取り
sudo apt-get install -y build-essential git pcscd libpcsclite-dev libccid pcsc-tools #必要ツールのインストール pcsc_scan
Japanese Chijou Digital B-CAS Cardと出たら成功である.
チューナードライバの導入
PLEX社が公開しているドライバを/lib/firmware以下に配置する.これを行わないと録画ができない.
wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip unzip PX-S1UD_driver_Ver.1.0.1.zip sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware
地上波復号ライブラリの導入
sudo apt-get install -y cmake g++ git git clone https://github.com/stz2012/libarib25.git cd libarib25 cmake . make sudo make install
余談だが,B-CASカードはなぜ必要なのかというと,テレビ線を伝ってきた信号を復号するための情報を得るためらしい. そんなものデータがあればいいのではと思うかもしれないし,実際にsoftCASなるものがあるみたいだが,録画以上にグレーらしいので使わない.
録画コマンドの導入
参考にさせてもらったサイトでは,satという方の作成した録画コマンドが使われていたが,何故か私の環境では動かなかったので,違うものを使う.
git clone https://github.com/dogeel/recdvb.git cd recdvb ./autogen.sh ./configure --enable-b25 make sudo make install
ここまでで,一応の録画はできるようになっているはずなので,テストする.
sudo adduser {録画サーバーのユーザ} video sudo reboot #ファームウェア等を追加したので念の為再起動 recdvb --b25 --strip --dev 0 20 10 test.m2ts #物理チャンネル20で10秒間録画する
vlcプレイヤーとかで再生してみて,何かの番組が映っていたら成功
録画コマンドが失敗する場合
ネットに転がっている情報だと,このテストは当然成功するものみたいに書いてあったにもかかわらず,このテストが通らなくて数時間試行錯誤したので,エラーと,対処をできるだけ詳しく書いていく. 同様のエラーに苦しんでいる方がいたら参考にしてもらいたい.
フロントエンドが開けない
$ recdvb --b25 --strip --dev 0 20 10 test.m2ts using B25... enable B25 strip using device: /dev/dvb/adapter0pid = 22199 cannot open frontend device
cannot open frontend deviceというエラーは,チューナーをオープンすることができないというものである.
考えられる原因と対処には以下が挙げられる.
ユーザがvideoグループに登録されていない
上の録画コマンドの導入のところにかいてあるが,実行ユーザをvideoグループに登録する.
sudo adduser {録画サーバーのユーザ} video
以下のコマンドの結果に実行ユーザが含まれていれば大丈夫.
cat /etc/group | grep video
チューナーが認識されていない
まずはlsusbの結果にチューナーが含まれているかを確認.もしなければ上の手順をやり直す.
以下のコマンドの結果にadapter0とかがあれば大丈夫.
ls /dev/dbv
チューナーが何か作業を行っている
しばらく待てば解決することもあるらしい.
ロックできない
$ recdvb --b25 --strip --dev 0 20 10 test.m2ts using B25... enable B25 strip pid = 1488 device = /dev/dvb/adapter0/frontend0 Using DVB card "Siano Mobile Digital MDTV Receiver" tuning to 521143 kHz polling..... Cannot lock to the signal on the given channel
このエラーは基本的にはファームウェア周りのエラーであるらしい.
ファームウェアが認識されていない
ファームウェアが/lib/firmwareに配置されているかを確認する.
ls /lib/firmware | grep isdbt_rio.inp
配置してあったらdmesgを確認する.
dmesg
[ 11.627821] smsmdtv:smscore_init_ir: IR port has not been detected [ 11.627828] smsusb:smsusb_probe: Device initialized with return code 0 [ 11.687497] dvbdev: DVB: registering new adapter (Siano Rio Digital Receiver) [ 11.689964] usb 1-4: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)... [ 11.690041] smsdvb:smsdvb_hotplug: DVB interface registered. [ 11.692556] usbcore: registered new interface driver smsusb
このようなログがあったらファームウェアは恐らく認識されているはず.
録画コマンドを変えてみる
はじめはsat氏の公開されている録画コマンドを使っていたが,私の場合には何度やってもうまくできなかった.
おかしいと思い,仮想マシンではなく,他の物理マシンで試してみたところ,その環境でも同様のエラーが起きた.
そのため,ファームウェア周りではなく,録画コマンドそのものの相性が悪いのではと思い,録画コマンドを変えたところ,正常に動作した.
なお,これはsat氏のコマンドが悪いと言っているわけではなく,単純に相性が悪かっただけだと思う.
下にいくつかの録画コマンドを紹介するので,複数試してみたらできるものが見つかるかもしれない.
Mirakurunの導入
このままでも録画はできるが,チューナーを生でいじっているようなものなので,使い勝手が悪い.そのためチューナーをいい感じに管理してくれるMirakurunというオープンソースのチューナー管理サーバを導入する.
インストール
下のセットアップマニュアルを参考にして導入する.Dockerを使う方ではないので注意.
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - sudo apt-get install -y nodejs sudo npm install pm2 -g sudo npm install mirakurun -g --production sudo mirakurun init sudo mirakurun restart
チューナーの登録
sudo mirakurun config tuners
- name: PX-S1UD-0 types: - GR command: recdvb --b25 --dev 0 <channel> - - isDisabled: false
録画コマンドを変えたときは,commandのところを変える必要があるかもしれないが基本はこれで大丈夫なはず.
sudo mirakurun restart
チャンネル設定
BS/CSは手書きで設定しなくてはいけないようだが,地デジは自動で取得してくれるらしい.
curl -X PUT "http://localhost:40772/api/config/channels/scan"
成功したらしばらくチャンネルの取得が続く.
ここでサーバーに拒否されたりしたら,設定がおかしい場合がある.以下のコマンドでログを確認して適宜対処する.
sudo mirakurun log server
チャンネルの設定が終わると,ログにその旨が書き込まれるので,再起動
sudo mirakurun restart
EPGStationの導入
番組表からの予約や,視聴を行うためにEPGStationというオープンソース録画管理ソフトを導入する.
EPGStationのインストール
予めffmpegをインストールしておく必要がある.
sudo apt install ffmpeg
あとは下の公セットアップマニュアルに従えばインストール完了.
セットアップが終了したら,ブラウザからアクセスできるが,起動してすぐだと番組表が表示されない.しばらくすると表示される.