Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

KVM上のUbuntuでMirakurun+EPGStationで録画サーバーを構築する

自宅サーバーで録画サーバーを構築したいと思い構築した.その記録を他の人にも参考になるかもしれないので記事にする.

環境は以下.

ホストOS Ubuntu 18.04.5 LTS
ゲストOS Ubuntu 18.04.5 LTS

用意した機材

録画を行うためには以下の機材が必要になる.

  • B-CASカード
  • テレビチューナー
  • B-CASカードリーダー
  • テレビ線

選ぶ機材にもよるが,私の場合には8000円ほどですべての機材が調達できた.

B-CASカード

自宅の使われていないテレビから拝借した.ない場合でも,B-CASを発行している会社にお布施をすればもらえるらしい.

f:id:Kotaro7750:20201015111820j:plain
B-CASカード

テレビチューナー

今回はUbuntuで構築するため,Ubuntuでの動作報告がされているものを選ぶと良い.

その他にも,同時録画可能数や,BS/CSの録画機能の有無などで判断する.

私は地デジで十分であり,同時録画数にもこだわらないため,安価であり,ubuntuでの動作報告が多いPLEX社のPS-S1UD Ver2を購入した.

仕様
同時録画数 1
録画可能チャンネル 地デジのみ
接続 USB

PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0

PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0

  • 発売日: 2015/09/10
  • メディア: エレクトロニクス

B-CASカードリーダー

Ubuntuでの動作報告がされており,安価なものを選ぶ.

今回はSCM Microsystemsの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氏のコマンドが悪いと言っているわけではなく,単純に相性が悪かっただけだと思う.

下にいくつかの録画コマンドを紹介するので,複数試してみたらできるものが見つかるかもしれない.

cgi1.plala.or.jp

github.com

Mirakurunの導入

このままでも録画はできるが,チューナーを生でいじっているようなものなので,使い勝手が悪い.そのためチューナーをいい感じに管理してくれるMirakurunというオープンソースのチューナー管理サーバを導入する.

github.com

インストール

下のセットアップマニュアルを参考にして導入する.Dockerを使う方ではないので注意.

github.com

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というオープンソース録画管理ソフトを導入する.

github.com

EPGStationのインストール

予めffmpegをインストールしておく必要がある.

sudo apt install ffmpeg

あとは下の公セットアップマニュアルに従えばインストール完了.

github.com

セットアップが終了したら,ブラウザからアクセスできるが,起動してすぐだと番組表が表示されない.しばらくすると表示される.