録画サーバを作ろうと思った経緯
みなさんこんにちは。まずは録画サーバを作ろうと思った経緯を話したいと思います。
私自身はそんなにテレビを見ませんw が、以下の理由から作ろうと思いました。
・サーバの知識があまりないから勉強になると思った
・子供や嫁さんがテレビ好きのためいつでも見れるようにしてあげたいと思った
・家にあるレコーダだと出先に見れない&古くなってきたのでいつ壊れてもおかしくない(15年選手)
正直3つ目の理由がメインで車で出かけた時に見れたらいいなーって気持ちで作成しました。
なぜラズパイ?ってのは手元にあったサーバになりそうなものがラズパイだけだったからです。
docker-mirakurun-epgstation とは
l3tnun様が公開しているEPGstationという録画管理システム?のDocker版です。
https://github.com/l3tnun/docker-mirakurun-epgstation
Docker版じゃないものもありますが、個人的にスクラップビルド(試行錯誤)しやすいDocker版を選びました。
※詳細設定等はDocker版じゃないものも一緒に見たほうが理解しやすいと思います。
ちなみに私の認識だと以下の区分けだと思っています。
なのでmirakurunさえ入っていればコマンドベースでの録画は可能です。
TV:mirakurun
レコーダ:EPGstation
一点重要なことがこの記事もそうですが、github上には公式版を改造した亜種版がいくつかあります。
各管理者が各々更新しているものもありますが、公式版に比べると陳腐化しやすいので
個人的には公式版を使用したほうがいいと思います。
(私は最初亜種版を使用し沼にハマりました、、、決して亜種版が悪いというわけではないですが、、、)
環境
物品 | 品名 |
---|---|
サーバ | Raspberry Pi4 4GB |
チューナ | PLEX Q1UD |
カードリーダ | ACR39-NTTcom |
B-cASカード | 地デジ専用 |
SDカード | Samsung microSDカード64GB EVO Plus microSDXC UHS-I U1 |
充電ケーブル | Anker PowerLine III USB-C & USB-C 2.0ケーブル |
充電器 | Anker PowerPort Atom III (Two Ports) (PD対応 60W 2ポートUSB-A & USB-C 急速充電器) |
テレビアンテナケーブル | ノイズフィルタ対策済みのやつがいいかも |
アッテネータ | Q1UDが内部で増幅してるっぽいので信号レベルが問題なければ不要 |
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
手順
使えないコマンドが合った場合は適宜パッケージのインストールが必要。
-
SDカードにラズパイOSをインストールする
先駆者を参考にしてください~(今後別記事で書く予定) -
ラズパイの初期設定を行う
先駆者を参考にしてください~(今後別記事で書く予定) -
Dockerをインストールする
先駆者を参考にしてください~(今後別記事で書く予定) -
Docker-composeをインストールする
先駆者を参考にしてください~(今後別記事で書く予定) -
チューナとカードリーダの設定
- 以下のコマンドで公式サイトからドライバをDL、解凍する
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/x86/i386/isdbt_rio.inp /lib/firmware/
- ドライバを反映させるため再起動する
sudo reboot
- ドライバが認識されているか確認(PX-S1UDが4つ認識されていればOK)
Q1UDはS1UDが4つ搭載されてるイメージになります。
pi@raspberry:~ $ dmesg | grep PX-S1UD
[ 2.766557] usb 1-1.3.1: Product: PX-S1UD Digital TV Tuner
[ 3.003321] usb 1-1.3.2: Product: PX-S1UD Digital TV Tuner
[ 3.233368] usb 1-1.3.3: Product: PX-S1UD Digital TV Tuner
[ 3.493271] usb 1-1.3.4: Product: PX-S1UD Digital TV Tuner
- カードリーダを認識させるため必要なパッケージをインストール
sudo apt install build-essential
sudo apt install pcscd libpcsclite-dev libccid pcsc-tools -y
- pcscdが動いていることを確認
pi@raspberry:~ $ service pcscd status
● pcscd.service - PC/SC Smart Card Daemon
Loaded: loaded (/lib/systemd/system/pcscd.service; indirect; vendor preset: enabled)
Active: inactive (dead)
TriggeredBy: ● pcscd.socket
Docs: man:pcscd(8)
- カードリーダを接続しB-CASカードを挿入し、認識されているか確認する
pi@raspberry:~ $ pcsc_scan | grep B-CAS
Japanese Chijou Digital B-CAS Card (pay TV)
- pcscdはdocker-mirakurun-epgstationで管理するため停止する
sudo systemctl stop pcscd.socket
sudo systemctl disable pcscd.socket
- 必要なものをDL、インストールする
- B-CASデコード用ライブラリ(libarib25)をインストール(ビルド)
※docker上で動作確認するのであれば不要
sudo apt install cmake -y
git clone https://github.com/stz2012/libarib25
cd libarib25
cmake .
make
sudo make install
- 録画用ライブラリ(recdvb-1.3.2)をDL、解凍
※docker上で動作確認するのであれば不要
sudo apt install automake -y
wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
tar xvzf recdvb-1.3.2.tgz
cd recdvb-1.3.2
- HTTPストリームをできるようにするため以下を編集
※docker上で動作確認するのであれば不要かも
vi recpt1.c
↓をコメントアウト
// struct hostent *peer_host;
// peer_host = gethostbyaddr((char *)&peer_sin.sin_addr.s_addr,
// sizeof(peer_sin.sin_addr), AF_INET);
// if ( peer_host == NULL ){
// fprintf(stderr, "gethostbyname failed\n");
// return 1;
// }
↓を編集
・編集前
fprintf(stderr,"connect from: %s [%s] port %d\n", peer_host->h_name, inet_ntoa(peer_sin.sin_addr), ntohs(peer_sin.sin_port));
・編集後
fprintf(stderr,"connect from: %s port %d\n", inet_ntoa(peer_sin.sin_addr), ntohs(peer_sin.sin_port));
- 信号レベルの表示を詳細化するため以下を編集
※信号レベル確認しないのであれば不要(個人的には推奨)
vi recpt1core.c
↓を編集(/* globals */のvoid以下に追記)
/* globals */
<snip>
void
print_stat(struct dtv_stats stat)
{
switch (stat.scale) {
case FE_SCALE_NOT_AVAILABLE:
fprintf(stderr, "N/A");
break;
case FE_SCALE_COUNTER:
fprintf(stderr, "%lld", stat.uvalue);
break;
case FE_SCALE_RELATIVE:
fprintf(stderr, "%lf", (float)stat.uvalue / 655.35);
break;
case FE_SCALE_DECIBEL:
fprintf(stderr, "%lf", (float)stat.svalue / 1000);
break;
}
}
void
↓を編集(calc_cn(void)以下をコメントアウトおよび追記)
calc_cn(void)
{
// int strength=0;
// ioctl(fefd, FE_READ_SNR, &strength);
// fprintf(stderr,"SNR: %d\n",strength);
struct dtv_property prop[4];
struct dtv_properties props;
prop[0].cmd = DTV_STAT_CNR;
prop[1].cmd = DTV_STAT_ERROR_BLOCK_COUNT;
prop[2].cmd = DTV_STAT_TOTAL_BLOCK_COUNT;
prop[3].cmd = DTV_STAT_SIGNAL_STRENGTH;
props.props = prop;
props.num = 4;
if (ioctl(fefd, FE_GET_PROPERTY, &props) < 0) {
fprintf(stderr,"Error\n");
} else {
fprintf(stderr, "CNR: ");
print_stat(prop[0].u.st.stat[0]);
fprintf(stderr, " ERRBLK: ");
print_stat(prop[1].u.st.stat[0]);
fprintf(stderr, " TOTALBLK: ");
print_stat(prop[2].u.st.stat[0]);
fprintf(stderr, " SIG: ");
print_stat(prop[3].u.st.stat[0]);
fprintf(stderr, "\n");
}
}
- 録画用ライブラリ(recdvb-1.3.2)をビルドする
※docker上で動作確認するのであれば不要
./autogen.sh
./configure --enable-b25
EXTRA_SID=1 make
sudo make install
- 録画できるかどうか確認(内容まで確認して問題なければOK)
pi@raspberry:~ $ recdvb --b25 --strip --sid hd 22 10 test.m2ts
using B25...
enable B25 strip
pid = 16318
device = /dev/dvb/adapter0/frontend0
Using DVB card "Siano Mobile Digital MDTV Receiver"
tuning to 527143 kHz
polling.
Overflow error, trying again (status = -1, errno = 75)..ok
CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -37.000000
bcas->init failed
Cannot start b25 decoder
Fall back to encrypted recording
Recording...
Available sid = 1048 1049 1432 1183
Chosen sid = 1048
Available PMT = 0x101 0x102 0x1fc8 0x7f0
Recorded 10sec
- 信号レベルが取得できるかどうか確認する(CNR:25、ERRBLK:0、SIG:-35~-40程度あればOK)
pi@raspberry:~ $ timeout 5 recdvbchksig --dev 0 22
device = /dev/dvb/adapter0/frontend0
Using DVB card "Siano Mobile Digital MDTV Receiver"
tuning to 527143 kHz
polling..ok
CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -38.000000
CNR: 25.000000 ERRBLK: 2413 TOTALBLK: 5178 SIG: -37.000000
CNR: 25.000000 ERRBLK: 0 TOTALBLK: 2656 SIG: -37.000000
CNR: 25.000000 ERRBLK: 0 TOTALBLK: 16186 SIG: -37.000000
CNR: 25.000000 ERRBLK: 0 TOTALBLK: 26560 SIG: -37.000000
SIGTERM received. cleaning up...
- docker-mirakurun-epgstationをインストール
- docker-mirakurun-epgstationをセットアップする
※gitが入ってない場合はインストールが必要
curl -sf https://raw.githubusercontent.com/l3tnun/docker-mirakurun-epgstation/v2/setup.sh | sh -s
cd docker-mirakurun-epgstation
- Docker-compose.ymlを修正する
vi docker-compose.yml
↓を修正する(mariadb:10.5はラズパイだと上手く動作しない)
mysql:
image: jsurf/rpi-mariadb
# image: mariadb:10.5
- Dockerfileを修正する
※Amatsukazeをリモート実行しないのであれば不要
cd epgstation
vi debian.Dockerfile
↓を追記する(末尾に追加) ※debianのversionが10以外の場合は別途確認が必要
# Install mono
RUN apt-get update && \
apt-get install -y apt-transport-https dirmngr gnupg ca-certificates && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && \
echo "deb https://download.mono-project.com/repo/debian stable-buster main" | tee /etc/apt/sources.list.d/mono-official-stable.list && \
apt-get update && \
apt-get install -y mono-complete
- config.ymlを修正する
cd config
vi config.yml
↓を修正する(monoを追加)
ffmpeg: /usr/local/bin/ffmpeg
ffprobe: /usr/local/bin/ffprobe
mono: /usr/local/bin/mono
- docker-mirakurun-epgstationを起動する
docker-compose up -d
- mirakurunとEPGstationにアクセスできるか確認
EPGstation・・・http://[ラズパイIPアドレス]:8888
mirakurun・・・http://[ラズパイIPアドレス]:40772
-
mirakurunをチャンネルスキャンする
※初回は全チャンネルスキャン推奨だがやらなくても勝手にスキャンは始めてくれる
curl -X PUT "http://localhost:40772/api/config/channels/scan"
sudo reboot
-
番組表が表示されていることを確認し録画、エンコードを試してみる
EPGstationに再度アクセスして番組表が表示されることを確認
※1時間程度反映までかかる
録画やエンコードを試してみて正常に録画されていることを確認する
デバッグに便利なコマンド
tail -n10000 ~/docker-mirakurun-epgstation/epgstation/logs/EPGUpdater/system.log | grep -e WARN -e ERROR
tail -n10000 ~/docker-mirakurun-epgstation/epgstation/logs/Operator/system.log | grep -e WARN -e ERROR
tail -n10000 ~/docker-mirakurun-epgstation/epgstation/logs/Service/system.log | grep -e WARN -e ERROR
課題、問題点、ハマったこと
-
4つあるチューナのうち一部のチャンネル、チューナで信号レベルが弱い時がある
Q1UDの問題?可能性としては熱暴走、ノイズを拾っちゃってるとか、、、
32bit版が問題?64bit版に移行してみたので結果は後程 -
チューナの動作が安定しない
Q1UDの問題?とりあえずACアダプタはつなげずにラズパイのバスパワーのみにしたら安定した
いつの間にかアダプタつないでたけど特に問題ない(原因不明) -
ハードウェアエンコードが使えない
32bit版のbullseyeOS以降だとOMX_H.264が対応してないっぽい
⇒メインPC(win10 pro)でAMATSUKAZE(エンコードソフト)サーバを立ててエンコード自体はメインPCで実施する形で解決 -
番組表が初回しか更新されない
亜種版を使ったのが原因、公式サイト手順でEPGstationを入れたら解決した!
※DBが上手く動作しなかったのが原因っぽい -
公式サイト手順で上手く動作しなかった
「mariadb:10.5」がラズパイだと動作しない
⇒ラズパイ用mariaDBを使用することで解決した!
※64bit版でも問題なく動作 -
VLCでテレビをリアルタイムに見たい
⇒参考サイト見て!