録画サーバー構築 Raspberry Pi 4b + USB boot Raspberry Pi OS 64bit (Docker-Mirakurun+Chinachu) ffmpeg H264_v4l2m2m HWエンコード

注意
2021年8月時点での録画サーバー構築覚書
内容を見てある程度分かる方向け

用意するもの
Raspberry Pi 4b
電源とUSBケーブル(安定して5V/3Aを出せるもので)
USBメモリ or USB SSD (転送速度の高速な物が良い)
Plex PX-S1UD V2.0
SCM ICカードリーダー/ライター SCR3310/v2.0
B-CASカード

その他 必要な方はアンテナ分配器やアンテナケーブルも。
Raspberry Pi 4b 2GB、Anker PowerPort+ 1、Amazon Basic USBケーブル(A to C )、Transcend 256GB USB3.2 Gen1 JetFlash 920、SWITCH SCIENCEのRaspberry Pi 4用メタルケース、カラフルCPUクーラーを使用した。

Raspberry Piの準備
https://www.raspberrypi.org/software/
Raspberry Pi Imagerを使用し、Raspberry Pi OS 64bitをインストール。現時点で最新版はv1.6.2

https://downloads.raspberrypi.org/raspios_arm64/images/
からRaspberry Pi OS 64bitの最新版をダウンロード。
https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-05-28/2021-05-07-raspios-buster-arm64.zip
今回は2021/05/07版をインストール。

起動時のホーム画面で Shift + Ctrl + X で Advanced options が出る。必要に応じて hostname , ssh , locale , Wi-Fi , timezone 等を設定。

画像1

参考
Raspberry Pi Imager v1.6で増えた拡張機能を試す

https://qiita.com/kinneko/items/0643f95f706ecf780fd5

また、2020/07/25版 bootloader と 2020/08/20版 Raspberry Pi OS 辺りから USB boot に対応したようなので、Storage に 高速で書き込み回数を SDカードほど気にしなくても良い USBメモリや USB SSD 辺りを使用することが可能になった。

参考
ラズパイ4をUSB接続のSSDから起動する方法(USBブート)

https://raspida.com/rpi4-ssd-usb-boot

注意点として、UASP(USB Attached SCSI Protocol)対応の USBメモリや、USBアダプターを接続した SSD から起動すると、転送速度が逆に遅くなり起動しないことがある。(boot 時に kernel panic を起こして進まなくなった(1敗))

参考
Raspberry PI 4B のUSB boot の注意事項

https://note.com/hash_define/n/n6b3d7dcdf539

Raspberry Pi 4のUSB 3.0ポートに接続したSATA接続のSSDからBOOTができない。(SSDがとても遅い) ーUASP対応じゃないとNGー
https://bigmoro.cocolog-nifty.com/blog/2020/09/post-a94d04.html


USB boot

// 母艦から ssh で接続
// source 有効化
sudo sed -i.bak -e "s/#deb-src/deb-src/g" /etc/apt/sources.list

// jp mirror を追加
cat << 'EOT' | sudo tee /etc/apt/sources.list.d/debjpmirror.list
deb http://ftp.jp.debian.org/debian/ buster main contrib non-free
deb http://ftp.jp.debian.org/debian/ buster-updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ buster main contrib non-free
deb-src http://ftp.jp.debian.org/debian buster-updates main contrib non-free
EOT

sudo apt update -qq && sudo apt -y upgrade

// 後からWi-Fiで接続したい場合、Wi-Fi機能がブロックされているため解除
// sudo rfkill unblock wifi

// nano を使いやすいように設定 (お好みで)
cp /etc/nanorc ~/.nanorc
nano ~/.nanorc
set constantshow
set linenumbers
set morespace
set smooth

// hostname 変更
echo "raspirec" | sudo tee /etc/hostname
sudo sed -i -e 's/127.0.1.1.*/127.0.1.1\t'raspirec'/' /etc/hosts

sudo reboot


// Static IP address
sudo cp -ap /etc/dhcpcd.conf{,.bak}
cat << 'EOT' | sudo tee -a /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.**.**/24
static routers=192.168.**.**
static domain_name_servers=192.168.**.**
interface wlan0
static ip_address=192.168.**.**/24
static routers=192.168.**.**
static domain_name_servers=192.168.**.**
EOT


デフォルトの Pi ユーザのままではセキュリティ的に怖いので変更
// 仮のユーザ(tmp)を作成する
sudo useradd -M tmp
// tmp ユーザを sudo グループに追加
sudo gpasswd -a tmp sudo
// tmp ユーザのパスワードを設定
sudo passwd tmp
// logout
exit

tmp で ssh
// ユーザ名を pi から raspirec に変更
sudo usermod -l raspirec pi
// ホームディレクトリを /home/pi から /home/raspirec に変更
sudo usermod -d /home/raspirec -m raspirec
// pi グループを raspirec グループに変更
sudo groupmod -n raspirec pi
// logout
exit

raspirec で ssh
// 仮ユーザを削除
sudo userdel tmp
// raspirec ユーザのパスワードを変更
sudo passwd raspirec


// disable swap
sudo swapoff --all
sudo systemctl stop dphys-swapfile.service
sudo systemctl disable dphys-swapfile.service
systemctl status dphys-swapfile.service

// enable swap
// sudo systemctl start dphys-swapfile.service
// sudo systemctl enable dphys-swapfile.service
// systemctl status dphys-swapfile.service


// Log suppression
sudo nano /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

// log2ram Install
// https://github.com/azlux/log2ram
// /var/log をRAMディスクに書き込むように変更
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 -y log2ram
sudo sed -i -e 's/USE_RSYNC=false/USE_RSYNC=true/' /etc/log2ram.conf


// Install Docker
curl -sSL https://get.docker.com | sh
sudo usermod -aG docker $USER
// enable Docker service
sudo systemctl enable docker
sudo systemctl start docker


// Install Docker-compose
sudo apt install -y git
git clone https://github.com/docker/compose.git
cd compose
// 1.28.x は build error が出るため、1.27.4 を選択
git checkout 1.27.4
sudo ./script/build/linux

// version check
cd dist
./docker-compose-Linux-armv7l version

sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
cd /usr/local/bin
sudo chown root:root docker-compose
sudo chmod 755 docker-compose


// ffmpeg
// build 済みの static を使用
mkdir -p ~/bin
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-arm64-static.tar.xz
tar xvf ffmpeg-release-arm64-static.tar.xz -C bin --strip-components 1
rm ffmpeg-release-arm64-static.tar.xz

// .bashrc に環境変数を追記
echo 'export PATH=$PATH:$HOME/bin' >> .bashrc
source ~/.bashrc

// 自力 build ver.
sudo apt build-dep ffmpeg

sudo apt update && sudo apt install \
 autoconf \
 automake \
 build-essential \
 cmake \
 git-core \
 libass-dev \
 libfreetype6-dev \
 libgnutls28-dev \
 libsdl2-dev \
 libtool \
 libva-dev \
 libvdpau-dev \
 libvorbis-dev \
 libxcb1-dev \
 libxcb-shm0-dev \
 libxcb-xfixes0-dev \
 pkg-config \
 texinfo \
 yasm \
 zlib1g-dev \
 libavresample-dev \
 libavresample4 \
 nasm \
 libx264-dev \
 libx265-dev \
 libnuma-dev \
 libvpx-dev \
 libmp3lame-dev \
 libopus-dev

mkdir -p ~/bin
git clone --depth 1 --branch release/4.3 git://github.com/FFmpeg/FFmpeg.git ffmpeg
cd ffmpeg

PATH="$HOME/bin:$PATH" ./configure \
--prefix=$HOME/bin \
--libdir=/usr/lib/aarch64-linux-gnu \
--incdir=/usr/include/aarch64-linux-gnu \
--enable-gpl \
--enable-nonfree \
--arch=aarch64 \
--enable-gnutls \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfontconfig \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libtheora \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-libxml2 \
--enable-libwebp \
--enable-libdrm

make -j"$(nproc)"
sudo make install


// Mirakurun Install
git clone https://github.com/Chinachu/Mirakurun mirakurun
cd mirakurun
wget https://raw.githubusercontent.com/Chinachu/Mirakurun/master/docker/docker-compose.yml
docker-compose pull
docker-compose run --rm -e SETUP=true mirakurun
docker-compose up -d


// nodejs Install
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install pm2 -g
sudo pm2 startup


// Chinachu Install
git clone git://github.com/Chinachu/Chinachu.git chinachu
cd chinachu
./chinachu installer
2) submodule
4) Node.js Modules

cp config.sample.json config.json
nano config.json
// "uid" に"1000" または "実行ユーザー名" を指定
  "uid": "1000",
// "recordedCommand" を追加
  "recordedCommand": "./encode.sh",

// 空ルールの作成
echo [] > rules.json

// processes.json の Node.js 環境指定を削除
sed -i '/exec_interpreter/d' processes.json

// 動作チェック
./chinachu service wui execute
// 問題なく起動できたらCtrl+\で終了
./chinachu update

sudo pm2 start processes.json
sudo pm2 save

// 起動
sudo pm2 start processes.json
// 再起動
sudo pm2 restart processes.json
// 停止
sudo pm2 stop processes.json


// log rotate
sudo pm2 install pm2-logrotate
cat << 'EOT' | sudo tee /etc/logrotate.d/chinachu
/usr/local/var/log/chinachu-operator.stderr.log
/usr/local/var/log/chinachu-operator.stdout.log
/usr/local/var/log/chinachu-wui.stderr.log
/usr/local/var/log/chinachu-wui.stdout.log
{
 weekly
 compress
 rotate 4
 missingok
 notifempty
}
EOT


// log の吐き捨て場を作成
touch ~/chinachu/log/encode.log

cat << 'EOT' | tee ~/raspirec/chinachu/encode.sh
#!/bin/sh
log=/home/raspirec/chinachu/log/encode.log
dir_output="./recorded/"
outfile=${1%.*}.mp4
mp4file=${outfile##*/}

until [ ! `pidof -s ffmpeg` ]
do
   sleep 60
done

echo -----start encoding @$(date +%Y/%m/%d/%H:%M:%S)----- >> $log
start=$(date +%s)
echo $1 >> $log

/home/raspirec/bin/ffmpeg -y \
-hide_banner \
-fflags +discardcorrupt \
-i "$1" \
-sn \
-c:v h264_v4l2m2m \
-b:v 4M \
-num_capture_buffers 64 \
-vf yadif=0:-1:1,scale=-1:720 \
-vsync 1 -qmin 10 -qmax 51 -qdiff 8 -i_qfactor 1.40 -qcomp 0.6 \
-c:a copy \
-bsf:a aac_adtstoasc \
-f mp4 \
"${dir_output}/${mp4file}" 2>&1 | grep "^[^f]" >> $log

end=$(date +%s)
diff=$(expr $end - $start)
echo about $(expr $diff / 60) min. >> $log
echo ---finish encoding @$(date +%Y/%m/%d/%H:%M:%S)--- >> $log
echo >> $log

exit 0
EOT

// 実行権限を付与
chmod +x ~/raspirec/chinachu/encode.sh

// hwencodeデバイスを有効化
echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' | sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules









この記事が気に入ったらサポートをしてみませんか?