🕺

知識0からRaspberryPi4で録画機を作る!

2021/06/28に公開

はじめに

みなさんV6とSexyZoneをご存知ですか?
そうです!
今年26年目にして解散してしまう至高のレジェンドアイドルV6と,今年10周年を迎える人生を共に歩む系アイドルSexyZoneです!彼らが出演した番組全部見逃すわけにはいかない!録画しなきゃ!

...しまった!!!!録画機がない!!!!作ろう!!!!

このような訳で録画機を作りました.
ラズパイを使って録画機を作る記事はたくさんあるのですが,ほぼ無知の状態から始めると躓いたところが多かったので,こちらの記事をベースとして補完する形で書いていきたいと思います.
正直自分自身あまり理解しきれていないところもあるので,詳しいことが知りたかったら元記事を参照することをおすすめします.

環境や用意するものなど

  • 作業環境:macOS BigSur
  • RaspberryPi4本体
    自分は丁度8GBモデルのものを頂いたのでこれを使いましたが,4GBで大丈夫だと思います.
  • RaspberryPiケース
    冷却ファンが付いているものが良いです.
  • microSDカード
    大量の読み書きを行うので高耐久なものが良いです.録画サーバーの用途としては容量はあまり必要ないので16GBなんかでも大丈夫みたいです.自分はSAMSUNGのProENDURANCEの32GBにしました.
  • USB地デジチューナー
    1chのものと4chのものがあります.自分は2グループ担当兼任しているので裏被りを恐れて4chにしました.これが一番高かった.でもそのうちWOWOW対応とかしたいし...
    1chのものを複数繋げることも可能ですが,USBの数も限られているのでここはお好みです.
  • アンテナケーブル
    テレビから伸びてるピンみたいな挿し口のケーブルです.これは元記事に書いていなくて焦りました.
  • B-CASカード
    使っていないテレビやレコーダーがあればそこから引っこ抜くと良いです.適当な理由をつけて2000円くらいで再発行してもらうこともできます.(内緒ですが)
  • B-CASカードリーダー
    動作確認されているものを選ぶと良いです.
  • USBハードディスク
    ログや録画データの保存用HDです.奮発して4TBにしました.
  • 分配プラグ
    設置予定の近くのアンテナケーブルの挿し口を探してください.既にテレビなどで使われている場合には分配器(タコ足みたいな感じ)が必要です.ちなみに,分配器+プラグ で買うより 分配プラグ で買った方が多少安いのでお気をつけください.

セットアップ等で必要なもの

  • 有線LAN/ Wi-Fi
    Raspberrypiの初期設定をするのに有線LANが必要です.
  • VirtualBox(Ubuntu)
    SDカードを長持ちさせるためのF2FS対応に必要です.インストールしてUbuntuの仮想環境を用意しておくと良いです.
  • SDカードリーダ
    OSインストールに必要です

セットアップ

機器の配線などの組み立ては最初からやっておいて大丈夫だと思います.

SDカードにOSイメージを展開

この辺りは元記事通りです.
https://downloads.raspberrypi.org/imager/ からimager_〇〇.dmgとなってるいい感じのファイルをダウンロードしてインストールします.
そして
Choose OS: Raspberry Pi OS (other) > Raspberry Pi OS Lite (32-bit)
Choose SD CARD: (自分が挿したSDカード)
をそれぞれ選択し,WRITEボタンを押します!

終わったら一旦SDカードを抜きます.
この時一応「SDカードを取り出す」という操作を忘れずに!

SSHの有効化

再度SDカードを挿すとbootという名前で認識されます.
SSHを有効化します.

touch /Volumes/boot/ssh

SDカードを安全に取り出してラズパイ本体に挿します.

有線LANによる疎通確認

ここも元記事通り.

ssh pi@raspberrypi.local

初期パスワード:raspberry
でログインします.pが入っているのでスペルミスにご注意.

初期設定

ラズパイの初期設定を行います.

sudo timedatectl set-timezone 'Asia/Tokyo'
sudo apt update && sudo apt upgrade -y
sudo apt install locales-all
sudo localectl set-locale 'LANG=en_US.UTF-8'

また,

sudo vi .bashrc

で.bashrcを開いたら

bashrc
export LC_ALL=en_US.UTF-8

を適当なところに追記します.

⭐︎viの操作

編集モード:[i]
コマンドモード:[esc]

コマンドモードの操作
1文字削除:[x]
1列削除:[d][d]
変更を破棄して終了: [:][q][!]
変更を保存して終了: [:][w][q]

Wi-Fi設定

wlan0を使えるようにします

sudo rfkill unblock wifi
wpa_passphrase "アクセスポイントのSSID" "パスワード"

と実行して出力された内容をコピーしておきます.

sudo vi /etc/wpa_supplicant/wpa_supplicant.conf 

でコピーしておいた内容を追記します.

追記が終わったらwlan0を稼働させます

sudo ifconfig wlan0 up

ifconfigでWi-FiのIPアドレスが振られているか確認します.

IPの固定化

sudo vi /etc/dhcpcd.conf

でdhcpcd.confを開き,以下のように編集します

dhcpcd.conf
# Example static IP configuration:
interface wlan0
static ip_address=192.168.0.20/24
static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

コメントを外し,interfaceをwlan0に変更します.

ここでrebootしたり有線LANを外して,動くか確認しておくと良いです.

SDカードの故障対策

録画機で使うとSDカードの読み書き回数が増えるので,故障しやすいみたいです.
録画機には安定稼働してもらいたいものなので,色々な対策を施します.

ログの抑制1

これを後でやるとスワップ領域のエラーが出て面倒なことになったので最初にやっとくと楽です.

sudo vi /etc/rsyslog.conf

以下のようにコメントアウトする.

rsyslog.conf
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
#kern.*                         -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
#mail.*                         -/var/log/mail.log
#user.*                         -/var/log/user.log
#mail.info                      -/var/log/mail.info
#mail.warn                      -/var/log/mail.warn
#mail.err                       /var/log/mail.err

スワップの無効化

sudo swapoff --all
sudo apt-get remove dphys-swapfile

F2FSの利用

SDカードを長持ちさせるため,F2FSというファイルシステムを使います.

RaspberryPi側での作業

あらかじめF2FSのパッケージをインストールしておきます.

sudo apt-get install f2fs-tools

bootとrootfsのパーティションを確認しておく

lsblk

シャットダウンしてSDカードをPCに挿します

VirtualBox側での作業1

F2FSの設定はUbuntu上で行います.
そのため,まずはVirtualBoxでUbuntuの仮想環境を構築します.
メモリ量などの設定はデフォルトのままで良いと思います.

Ubuntuのインストールが終わったら,まずF2FSのパッケージをインストールします.

sudo apt-get install f2fs-tools

ここからSDカードを仮想環境に認識させる操作を行うため,自分をdiskグループに入れます

sudo gpasswd -a ユーザ名 disk

ここで一旦仮想環境をシャットダウンしておきます.

Terminal側での作業

このあたりのSDカードをVirtualBoxに認識させる作業はこちらの記事を参考にしています.

SDカードの割り当てを確認します

mount

bootでデバイス名がdev/disk2s1のようになっていると思うので,ここのdev/disk2という部分を覚えておきます.

次に,アプリケーション>ユーティリティ>ディスクユーティリティでディスクユーティリティを開き,SDカードをマウント解除します.(※取り出すではないので注意)

SDカードをデバイスとして仮想マシンにマウントできるようにするため,VirtualBox vmdkファイルを作ります./dev/disk2の部分は上で確認した自身の環境に合わせて変えてください.

sudo VBoxManage internalcommands createrawvmdk -filename ./sd-card.vmdk -rawdisk /dev/disk2

パーミッションを変更します.

sudo chmod 777 /dev/disk2
sudo chmod 777 ./sd-card.vmdk

macではこのあたりでなぜか勝手にまたマウントされているので,ここで一度ディスクユーティリティを開いてSDカードをもう一度マウント解除します.

VirtualBoxを開いて,設定>ストレージを開き,コントローラー:SATAの右にある「ハードディスクの追加」からsd-card.vmdkを選択する.
OKを押して起動する.(※ここで黒い画面のまま起動しなくなったら,他の起動モードを使うと動く場合もあります)

lsblkコマンドでSDカードが認識されているか確認します.

さて,本筋に戻ってSDカードマウント用のディレクトリを作成し,SDカードをマウントします.

sudo mkdir /mnt/boot
sudo mkdir /mnt/rootfs
sudo mount /dev/sdb1 /mnt/boot
sudo mount /dev/sdb2 /mnt/rootfs

マウントしたrootfs側のファイル一式をUbuntu側にコピーしておきます.

cd /mnt/rootfs
sudo tar cvzf ~/rootfs.tar.gz .

rootfsをアンマウントしてF2FSファイルシステムを作成します.

cd ..
sudo umount /mnt/rootfs
sudo mkfs.f2fs -f -l rootfs /dev/sdb2

マウントして,先ほど退避させておいたrootfsのファイル一式を展開します.

sudo mount /dev/sdb2 /mnt/rootfs
cd /mnt/rootfs
sudo tar xzvpf ~/rootfs.tar.gz

fstabに書かれたファイルシステムをf2fsに変更します.

sudo vi /mnt/rootfs/etc/fstab

/のファイルシステムをext4からf2fsへ書き換えます.

bootパーティションにある設定ファイルを書き換えます.

sudo vi /mnt/boot/cmdline.txt

rootfstypeext4からf2fsへ書き換えます.

最後にアンマウントします.

sudo umount /mnt/boot
cd ..
sudo umount /mnt/rootfs

VirtualBoxはシャットダウンし,SDカードを安全に抜き,RaspberryPiに挿して電源を入れ,無事起動されるか確認します.
起動後にdf -Tなどでf2fsと認識されているか確認しておくと安心です.

ログの抑制2

ログローテーションの頻度を低くします.

ls /etc/logrotate.d

で確認した各設定ファイルをviで開いて,
rotate1dailyweeklymonthlyに変更します.

log2ramの導入

ログをRAMディスクに書き込むように変更することで,SDカードへの書き込みを減らします.

echo "deb http://packages.azlux.fr/debian/ buster main" | sudo tee /etc/apt/sources.list.d/azlux.list
wget -qO - https://azlux.fr/repo.gpg.key | sudo apt-key add -
sudo apt update
sudo apt install log2ram
sudo vi /etc/log2ram.conf

USE_RSYNC=trueに変更します.

ここで一旦rebootしておきます.

FFmpegでH.264のハードウェアエンコードができるようにする

echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' | sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules

PX-S1UD V2.0 チューナーのドライバインストール

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/

再起動してから,

dmesg | grep PX-S1UD

を実行するとPX-S1UD Digital TV Tunerが4つ見えると思います.

カードリーダーの準備

sudo apt install build-essential pcscd libpcsclite-dev libccid pcsc-tools

インストールが終わったら,

sudo pcsc_scan

Japanese Chijou Digital B-CAS Card (pay TV)など出ていればOKです.

B-CASデコード用のライブラリをインストール

こちらを使います.

sudo apt install cmake g++
git clone https://github.com/stz2012/libarib25
cd libarib25
cmake .
make
sudo make install

録画用コマンドをインストール

sudo apt install automake
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
./autogen.sh
./configure --enable-b25
EXTRA_SID=1 make
sudo make install

recdvb --b25 --strip --dev 0 20 10 test.m2tsと実行してみると,物理チャンネル20を10秒間録画してtest.m2tsに保存できているはずです.(Recorded 10secと出ているとOKです)

外付けHDDをUSBポートに接続する

lsblkコマンドで外付けハードディスクのパーティションを確認しておく.
以下の場合は/dev/sda1が外付けハードディスクのパーティションとしています.

sudo mkfs.ext4 /dev/sda1
sudo mkdir /data
sudo mount /dev/sda1 /data

外付けハードディスクのパーティションのIDを調べます.

sudo blkid /dev/sda1

実行結果のPARTUUIDをコピーし,/etc/fstabに追記します.

sudo vi /etc/fstab
fstab
PARTUUID=調べたID  /data           ext4    defaults,nofail 0 0

を追記します.
ここで一度rebootして,マウントされるか確認しておくといいです.

Dockerのインストール

curl -sSL https://get.docker.com | sh

Docker Composeのインストール

aptコマンドでインストールするdocker-composeはバージョンが古いのであれこれがんばります.
どうも調べていると,Raspberry Pi OS Lite (32-bit)ではバイナリを持ってくるやり方が使えないらしく,自分でビルドするらしいけど上手くいかない…
docker-compose公式のインストール手順を見て試行錯誤の末,pipコマンドを使った方法で最新版のインストールに成功したので書いておきます.
これは弄くり回したやり方なので,もっとスマートなやり方があるかもしれない.

まずpipを入れます.

sudo apt install python-pip python3-pip

バージョンを見てみると古〜い!ついでにpythonも古〜い!
とりあえず見つけた記事にあったようにpipをアップデートしてみる.

pip install -U pip

しかしどうもpythonの様子がおかしい.調査しているとpythonコマンドとpython3コマンドが別物になっているみたいです.docker-composeのインストールをするにあたってpythonコマンドでPython3を使えるようにしておくのが良さそうです.
そのため,LinuxのAlternativesを利用してpythonコマンドでpython3を呼び出せるようにします.
詳しいことはこちらの記事で見てください.
まずはpythonコマンドが何を示しているか確認します.また,python3の実行ファイルがあるかも確認します.

ls -al /usr/bin/python
ls /usr/bin/ | grep python

確認したら実行可能ファイルを登録します.

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2

ここら辺は上で確認したご自身の環境に合わせてください.

登録したpythonのバージョンを選択します.

sudo update-alternatives --config python

自分はpython3.7のmanual modeのものを選びました.
これでpython --versionで調べてみて最新版になっていれば成功です.

さて,ようやくdocker-composeを入れます.

pip install docker-compose

最新版が入っているか確認します.

docker-compose -v

最新版ってどれ!?となったら公式リポジトリに書いてあります.
もしできなかったら,公式のインストール手順に依存パッケージとして記述されていた以下のパッケージを入れるといいかもしれません.

sudo apt install python3-dev libffi-dev libssl-dev gcc libc-dev cargo make
curl https://sh.rustup.rs/ -sSf | sh

自分にはこれが必要だったのか否か確認する術がないです.

MirakurunとEPGStationのセットアップ

ここから元記事で使用していたリポジトリが動かなかったので,こちらの記事を参照します.

MirakurunとEPGStationのインストールにはこちらのリポジトリを使わせてもらいます.2021/5/27の時点で動きました.

ソースコードを取得

cd /data
git clone https://github.com/CH3COOH/docker-mirakurun-epgstation.git
sudo chown pi:pi docker-mirakurun-epgstation

configファイルをコピー

cd docker-mirakurun-epgstation
cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml

エンコードのためにFFmpegを入れます

sudo apt install ffmpeg

ffmpeg -encoders | grep h264を実行してh264_omxが見えればOK

ここを参考に設定ファイルを書き換えます.
whichコマンドでffmpegffprobeの場所を調べておき,設定ファイルで該当箇所を編集します.多分,特にいじっていなければデフォルトのままでOKです.

which ffmpeg
which ffprobe
sudo vi /data/docker-mirakurun-epgstation/epgstation/config/config.yml

docker-composeを使ってビルドを開始します

cd /data/docker-mirakurun-epgstation
sudo docker-compose run --rm -e SETUP=true mirakurun
sudo docker-compose up -d

ここは30分弱くらいで完了するかと思います.

ここで一回http://RaspberrypiのIPアドレス:8888にアクセスしてEPGStationが見れるか確認しておくと良いです.

Mirakurunのチャンネルスキャン

一応やっておきます.

curl -X PUT "http://raspberrypi.local:40772/api/config/channels/scan"

Sambaで録画したデータを見れるようにする

PCから録画したデータを見れるようにしたいので,Sambaを導入します.
ここはこのへんの記事を参照しています.

さて,まずはSambaサーバーをインストールします.

sudo apt install samba samba-common-bin

ここで何か聞かれるのでデフォルトのままnoを選択します.

設定を行います.

sudo nano /etc/samba/smb.conf

こんな感じのことを書けば良いらしい.

[pi] #共有フォルダの名前
comment = RaspberryPi-shared-folder #コメント自由記述
path = /home/pi/ #共有フォルダのパスを指定する
guest ok = no #ゲストアカウント(パスワード不要)で接続を許可するかどうか。
read only = no #読み取り専用かどうか。書き込みもしたい場合は、no
force user = pi #ファイル操作を、ユーザー「pi」 によって実行。
たしか自分は録画用ハードディスクを/dataにマウントしたので書き換えてみます.

smb.conf
[share]
comment = RecordedData             
path = /data/docker-mirakurun-epgstation/recorded    
guest ok = no
read only = no
force user = pi

保存したら[Control]+[x]で閉じます.

Sambaユーザーのパスワードを設定します.

sudo smbpasswd -a pi

piはユーザー名です.デフォルトのユーザー名がpiみたいですね.

Sambaを再起動します.

sudo systemctl restart smbd

Sambaの起動状況を確認します.

sudo systemctl status smbd

おお動いてる…!Active: active (running)となっていればOKです.

一応もう一度IPアドレス確認しておきます.

ip a

wlan0:の箇所のinetに続くところです.

そしてMacから繋げてみます!
MacのFinderから移動>サーバへ接続を開き,
smb://RaspberryPiのIPアドレスを入力し,接続します.

ログインを求められると思うので,登録ユーザで

ユーザ:pi
パスワード:Sambaユーザのパスワード設定で設定したもの
を入力して接続します.

ラズパイのIPアドレス” 上のマウントするボリュームを選択してくださいと聞かれるので,OKを押すとFinder内で録画したデータが見れるようになります!やったー!

使ってみる

できたっぽいが,肝心の使い方が乗ってる記事が見つからない笑
docker-mirakurun-epgstationのリポジトリが一番それっぽいのでやってみる.

とりあえず起動したままだったので停止する

sudo docker-compose down

そしてまた起動!

sudo docker-compose up -d

mirakurun の EPG 更新を待ってからブラウザで http://DockerHostIP:8888 へアクセスし動作を確認する
とのことなのでhttp://RaspberrypiのIPアドレス:8888にMacからアクセスしてみます.
自分はここでちょっとエラーが起こりましたが,EPGStationのセットアップ周りをやり直したら直りました.やったー!録画できるー!

試しに適当な番組録画してみました.
エンコードをしてからみれるっぽい?雰囲気です.
ffmpegを入れた時に確認したh264_omxにしておけば良さそうですね.
エンコードは中々時間掛かりましたが………見れたー!!!
すげ〜同じWi-Fiならスマホからでも録画できる…!
15日間の死闘を推しのために戦い抜きました…感慨深い…!!!

初期化手順

まずSDカードをUSBリーダーに挿した状態でRaspberryPiImagerを起動し,以下のように設定してWRITEを押します.
Choose OS: Erase
Choose SD CARD: (自分が挿したSDカード)
ディスクユーティリティで確認して空になっていたらOKです.

次に,過去の接続情報を消します.

ssh-keygen -R raspberrypi.local

また,F2FSのあたりでつまづいた場合はVirtualBoxの仮想環境も作り直した方が楽なのでいいと思います.
Virtual Box上で該当の仮想環境を削除し,userディレクトリの直下にあるvmdkファイルも消しておきます.場合によってはVirtualBox内にvmdkファイルが残ってしまってエラーになる場合もあるので,次に作る時は少し名前を変えるなどすると良いと思います.

ここまでしたら一番初めに戻ってOSのインストールからやり直します.
ここは根気です!推し駆動開発でがんばりましょう!

Discussion