【備忘録】ラズパイを使った録画サーバの構築
ラズパイを使った録画サーバの構築
新型コロナウイルスに伴う非常事態宣言下*1での自粛生活において,Raspberry Pi を使った玩具作りは絶好の暇潰しになります.
私は録画サーバの作成を試みました.後で調べたんですが,最近の録画機能付きTV滅茶苦茶安いですね.今回作った録画サーバの総額より安いんじゃないだろうか.あれ?じゃあ録画サーバなんて作る必要無くね...???
昨今の家電業界における熾烈な価格競争にヒリつきつつ,暇潰しと割り切って作成した録画サーバの環境構築をメモしていきます.
何回かに分けて投稿しましたので,本ブログ記事にて目次を作成しました.0回から4回までの全5回構成となっております.
なお,ブログ記事における環境構築に関しましては,多くの箇所にてきじのしっぽ様による以下の解説書を参考とさせて頂いております. k-s.booth.pm
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
目次
【備忘録】ラズパイを使った録画サーバの構築 3回(ソフトウェア周り構築編)
ラズパイを使った録画サーバの構築(ソフトウェア周り構築編)
前回の続き.前回↓ miyakonorth.hatenablog.jp
本ブログ記事も前回に引き続ききじのしっぽ様による以下の解説書を参考とさせて頂いております. k-s.booth.pm
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
librarib25のインストール
デジタル放送におけるアクセス制御方式の規格ARIB STD-B25*1をLinuxで使用するためのライブラリです.
$ git clone https://github.com/stz2012/libarib25.git $ cd libarib25 $ mkdir build $ cd build $ cmake .. $ make -j4 $ sudo make install -j4
recdvbのインストール
$ git clone https://github.com/dogeel/recdvb.git $ cd recdvb $ ./autogen.sh $ ./configure --enable-b25 $ make -j4 $ sudo make install -j4
テストで録画してみる
正しくインストールできたか,実際に番組を録画してみて確認します.
某アンテナメーカーが公表している各地の番組表を基に,録画したい番組のチャンネルを選びます.
https://www.maspro.co.jp/contact/channel.pdf
本ブログ記事の例では,群馬県は前橋の送信塔から群馬テレビを受信すると想定し,チャンネルを19とします.
以下のコマンドでは,群馬テレビを10秒録画します.
$ recdvb -b -s 16 10 test_video.m2ts
Node.jsのインストール
Node.jsの最新バージョンは14台までありますが,後にインストールするChinachuにて推奨されているバージョンが12台まででした.(2020年04月現在).
よって,Version 12.16.2をインストールします.
$ sudo curl -sL https://deb.nodesource.com/setup_12.x | bash - $ sudo apt-get install -y nodejs
インストールされたか確認.
$ nodejs -v v12.16.2 $ npm -v 6.14.4
PM2のインストール
アプリのデーモン化を行うサービスです.
$ sudo npm install pm2 -g $ sudo pm2 startup
Mirakurunのインストール
Githubの公式リポジトリにあるドキュメントを参考に.
Mirakurun/Platforms.md at master · Chinachu/Mirakurun · GitHub
$ sudo npm install mirakurun -g --unsafe-perm --production
MIrakurunにチューナの設定をする
本ブログ記事ではチューナにPX-S1UDを使用しています.使用機材について↓ miyakonorth.hatenablog.jp
よって,MIrakurunにPX-S1UDを使用するための設定をします.
以下のコマンドでチューナの設定ファイルがvimで開かれます.
$ sudo mirakurun config tuners $ sudo mirakurun restart
設定ファイルの内容を以下のように書き換えます.
- name: PX-S1UD-1 types: - GR command: recdvb -b -s <channel> -- isDisabled: false
チャンネルスキャンを行う
以下のコマンドで自動的にチャンネルを探し出し,設定をしてくれます.
$ curl -X PUT "http://localhost:40772/api/config/channels/scan" $ sudo mirakurun restart
Chinachuのインストール
Githubの公式リポジトリにあるドキュメントを参考に.
Gamma Installation V2 · Chinachu/Chinachu Wiki · GitHub
$ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu $ cd ~/chinachu/ $ ./chinachu installer # Auto を選択
Chinachuを設定
config.json
を設定します.
$ cp config.sample.json config.json $ vi config.json
各環境に合わせて以下を参考に設定.
Gamma Installation V2 · Chinachu/Chinachu Wiki · GitHub
空のルール設定ファイルを作成
ここで作成するrules.json
は,毎週録画など録画のルールを保存するファイルとなります.
$ echo [] > rules.json
動作チェック
以下を参考に.
Gamma Installation V2 · Chinachu/Chinachu Wiki · GitHub
pm2に登録
$ sudo pm2 start processes.json $ sudo pm2 save
PM2を確認すると,上記までに登録したMirakurunとChinachuが登録されていることが確認できると思います.
$ sudo pm2 list
以下のような出力が得られるかと思います.
構築に失敗してうまく動いていないとStatusの項目がError
などと表示されているかと思います.
以上で録画環境の構築は完了です.
環境による個人的な都合
Chinachuではテレビ番組をリアルタイム視聴することもできるのですが,私の環境では一瞬で処理落ちして視聴できませんでした.
Raspberry Pi Model 3B+ではこれが限界ということでしょうか.
まあ本ブログ記事での工作は録画さえできればヨシ!
次回
エンコード周りを構築していきたいと思います.次回↓ miyakonorth.hatenablog.jp
【備忘録】ラズパイを使った録画サーバの構築 4回(自動エンコード構築編)
ラズパイを使った録画サーバの構築(自動エンコード構築編)
前回の続き.前回↓ miyakonorth.hatenablog.jp
テレビ番組の録画から保存までをできるようになりました.しかし,現状では地上波の生データをそのまま保存しているため,結構な容量があります(例えば,1時間の番組だと6 GBくらい使います).
よって,録画した番組をエンコードし,容量を圧縮して保存するようにします.本ブログでは自動で定期的にエンコードを行う所までを実装します.
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
エンコード周りの構築
まず,エンコード周りについて調べていたら宇宙猫*1と化しました.
とは言え環境構築をしないと何も始まらないので,各フォーマットにおけるメリットやデメリット等のサーベイは取り敢えず保留し,思考停止でH.264の規格でエンコードすることにします.
H.264の規格でエンコードするにはx264が便利らしいので,x264に対応させた形でFFmpegをビルドします.
yasmのインストール
$ wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz $ tar xvfz yasm-1.3.0.tar.gz $ cd yasm-1.3.0/ $ ./configure --prefix=/usr/local $ make -j4 $ sudo make install -j4
nasmのインストール
$ sudo apt-get install nasm
alsaのインストール
http://ftp://ftp.alsa-project.org/pub/lib/
$ wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz $ tar xvfz yasm-1.3.0.tar.gz $ cd yasm-1.3.0 $ ./configure --prefix=/usr/local $ make -j4 $ sudo make install -j4
後で調べたらalsaもaptでインストールできたらしい...
x264のインストール
この辺記憶が曖昧で,x264のビルドにもっとライブラリが必要だった気がする.
$ git clone git://git.videolan.org/x264.git $ cd x264/ $ ./configure --enable-shared --disable-opencl --prefix=/usr/local $ make -j4 $ sudo make install -j4 $ sudo ldconfig
FFmpegのインストール
$ git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git $ cd ffmpeg $ ./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-mmal --enable-omx-rpi --enable-omx --extra-cflags="-I/<path_to_ffmpeg>/ffmpeg/include" --extra-ldflags="-L/<path_to_ffmpeg>/ffmpeg/lib" --extra-libs=-ldl $ make -j4 $ suo make install -j4
--enable-nonfree
,--enable-gpl
:GPLライセンスを承認するオプション.x264はGPLライセンスであるため,GPLライセンスであることを承認しないとビルドできません.enable-x264
:x264を有効にするオプション
ライブラリの再読み込み
$ sudo ldconfig
FFmpegの実行テスト
$ ffmpeg -i test_movie.m2ts -b:v 1000k -b:a 128k -vcodec libx264 output.mp4
スクリプトからエンコードを実行する
以下を参考に Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築 - Qiita
以下のスクリプトを用意しました.以下ではスクリプト名をencode.sh
とします.
#! /bin/bash X264="-f mp4 -c:v h264_omx -c:a copy -r 23.98 -s 1920x1080 -b:v 4500k -threads 0 -flags +ilme+ildct -top -1 -deinterlace -preset veryfast -y" DIR1="/mnt/data/recorded" #生データの番組を保存しているディレクトリのパス DIR2="/mnt/data/processing" #エンコード中の番組を置いておくパス DIR3="/mnt/data/encoded" #エンコードした番組を保存しておくディレクトリのパス EXT="m2ts" ENCEXT="mp4" cd $DIR1 orgfpath=`find $DIR1 -maxdepth 1 -type f -name "*.$EXT" -print0 | xargs -0 ls -rt | awk 'NR==1' | awk '{printf $0}'` # エンコード対象ファイルがない場合はスキップ if ! [ -e "$orgfpath" ]; then exit 0 fi orgfname="${orgfpath##*/}" encfname="${orgfname%.*}.$ENCEXT" echo "orgfile=$orgfname" echo "encfile=$encfname" cd $DIR2 count=`find $DIR2 -maxdepth 1 -type f -name "*.$EXT" -printf '.' | wc -c` echo "encoding count $count" if [ $count -lt 2 ]; then mv "$orgfpath" "$DIR2" ffmpeg -fflags +discardcorrupt -i "$DIR2/$orgfname" -bsf:a aac_adtstoasc $X264 "$DIR2/$encfname" mv "$DIR2/$encfname" "$DIR3" rm -f "$DIR2/$orgfname" fi echo "end"
テストで動かしてみます.
$ sudo chmod 755 encode.sh $ ./encode.sh
スクリプトを自動化する
cron*2でスクリプトを定期的に動かしてくれるらしい.
rsyslog.conf
を開き
$ sudo vi /etc/rsyslog.conf
以下のコメントアウトを外す.
cron.* /var/log/cron.log
再起動.
$ sudo /etc/init.d/rsyslog restart
crontab
を開き編集します.
$ crontab -e
crontab
を設定します.以下の設定で毎日午前10時にエンコードが実行されるように設定しました.
00 10 * * * /<エンコードするためのスクリプトのパス>/encoded.sh > /home/pi/myjob.log 2>&1
デバッグのためにmyjob.log
にコマンド実行時のログを記録したかったので,> /home/pi/myjob.log 2>&1
と明記.
数字は左から順番にコマンドを実行する分
,時
,日
,月
,曜日
らしい.
例えば毎週金曜日の午後03時00分にコマンドTINTIN_frafra_Friday
を実行したい場合,以下のように設定します.
00 15 * * 5 TINTIN_frafra_Friday
ffmpegのシンボリックリンクを設定
cronからだとffmpegコマンドが実行できなかったので,シンボリックリンクを貼りました.
$ sudo ln -s /usr/local/bin/ffmpeg /usr/bin/ffmpeg
終わりに
取り敢えず定期的にエンコードが実行される環境を構築できました.
普段動画編集とか一切しないのでエンコードに関する知見は新鮮でした.
あとcronの存在を初めて知りました.電源入れっぱなしを前提とするマシンではかなり便利につかえそうだなと思いました(ボキャ貧).
参考
Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築 - Qiita
H.264対応のffmpegをLinux環境でビルドする - 動かざることバグの如し
Rapberry Pi 3 のハードウエアエンコーダh264_omxが使えるFFmpegをビルドする
【備忘録】ラズパイを使った録画サーバの構築 2回(チューナ周り準備編)
ラズパイを使った録画サーバの構築(チューナ周り準備編)
前回の続き.前回↓ miyakonorth.hatenablog.jp
本ブログ記事の環境構築等に関しましてはきじのしっぽ様による以下の解説書を参考とさせて頂いております.
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
B-CASカードリーダの環境構築
$ sudo apt-get install pcscd \ libpcsclite-dev \ libccid \ pcsc-tools
pcsc-tool
はこの後でB-CASカードが正しく検出できているかを調べるためのパッケージです*1.
gtk-perlを必要とするパッケージで,前回でGUI関係を削除した場合,GUIに関連するパッケージが同時にインストールされます.
インストール後に以下のコマンドでB-CASカードの検出を確認できます.
$ sudo pcsc_scan
以下の様な結果が出力され,
Using reader plug'n play mechanism Scanning present readers... 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] (53311943201342) 00 00 Sat May 9 02:21:03 2020 Reader 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] (53311943201342) 00 00 Event number: 0 Card state: Card inserted, ATR: 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 ATR: 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 + TS = 3B --> Direct Convention + T0 = F0, Y(1): 1111, K: 0 (historical bytes) TA(1) = 12 --> Fi=372, Di=2, 186 cycles/ETU 21505 bits/s at 4 MHz, fMax for Fi = 5 MHz => 26881 bits/s TB(1) = 00 --> VPP is not electrically connected TC(1) = FF --> Extra guard time: 255 (special value) TD(1) = 91 --> Y(i+1) = 1001, Protocol T = 1 ----- TA(2) = 81 --> Protocol to be used in spec mode: T=1 - Unable to change - defined by interface bytes TD(2) = B1 --> Y(i+1) = 1011, Protocol T = 1 ----- TA(3) = 7C --> IFSC: 124 TB(3) = 45 --> Block Waiting Integer: 4 - Character Waiting Integer: 5 TD(3) = 1F --> Y(i+1) = 0001, Protocol T = 15 - Global interface bytes following ----- TA(4) = 03 --> Clock stop: not supported - Class accepted by the card: (3G) A 5V B 3V + Historical bytes: + TCK = 99 (correct checksum) Possibly identified card (using /usr/share/pcsc/smartcard_list.txt): 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 Japanese Chijou Digital B-CAS Card (pay TV) \
最後の3行が出力されれば検出は成功です.
Possibly identified card (using /usr/share/pcsc/smartcard_list.txt): 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 Japanese Chijou Digital B-CAS Card (pay TV)
TVチューナの環境構築
PX-S1UDのドライバはLinuxの場合,カーネル3.15以降からデフォルトで対応してるらしいです.
よって,後はファームウェアを準備すれば良いことになります.
メーカーのダウンロードページ*2からWindows向けのドライバをダウンロードし,ドライバ内にあるファームウェアをコピーし,導入します.
$ 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 $ cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware
再起動し,
$ sudo reboot
カーネルモジュールがロードされたこと,ドライバの存在を確認します.
$ lsmod | grep smsusb smsusb 16384 0 smsmdtv 53248 2 smsdvb,smsusb $ ls /dev/dvb adapter0
次回
TVチューナサーバと録画サーバ周りの環境構築をやりたいと思います.次回↓ miyakonorth.hatenablog.jp
参考
【備忘録】ラズパイを使った録画サーバの構築 1回(Raspberry Piの準備編)
ラズパイを使った録画サーバの構築(Raspberry Piの準備編)
前回の続き.前回↓ miyakonorth.hatenablog.jp
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
SSHを有効にする
SSHを有効にして,SSH通信で環境を構築できるようにします.
RaspbianならコマンドでもGUIでもSSHの設定ができます.本ブログではGUIで有効に設定したので特に明記することはありません().
ラスパイの固定IP化
ラズパイを直接弄らずリモートで環境を構築したり,LAN内から別なPCやスマホから番組録画を行う際に固定IPの方が便利なのでラズパイのIPを固定にします.
IPを固定にする際,ルータの設定を確認してDHCPに割り振られるIPの範囲を確認し,DHCP向けに確保された範囲外のIPを設定する必要があります.
端末からdhcpcd.conf
を開き,
$ sudo vi /etc/dhcpcd.conf
以下を追加します.
interface wlan0 static ip_address=<割り当てるIPアドレス>/24 static routers=<ルータのIPアドレス> static domain_name_servers=<ルータのIPアドレス>
後は取り敢えず再起動して,
$ sudo reboot
SSHで設定したIPにてラズパイにログインできるか確認します.
本ブログではWindowsマシンからTeraTermを使用してSSH通信しています.
以降はSSH通信していることを前提とします.
GUIを消した
SSH通信で全てCUIで操作するので,使いもしないのに容量だけ食うGUIを消しました.消すかどうかはあくまでお好みで.
$ sudo apt-get purge x11-common $ sudo apt-get autoremove
外付けHDDを繋げてLAN内の別のマシンからアクセスできるようにする
↓だいたいこんな感じのものを想定しています.
ラズパイで録画,エンコードした番組をUSB2.0で繋いだ外付けHDDに保存し,LAN内の違うマシンから保存した番組を閲覧することを想定しています. 以下の記事を参考に構築.
SambaでLinuxとWindowsとの間でファイル共有 - Qiita
この次にやること
番組を取得するための環境づくりを始めたいと思います.次回↓ miyakonorth.hatenablog.jp
参考
【備忘録】ラズパイを使った録画サーバの構築 0回(機材準備編)
ラズパイを使った地上波録画サーバの構築(機材準備編)
本記事は機材準備編となります.
本ブログ記事における機材準備に関しましては,きじのしっぽ様による以下の解説書を参考とさせて頂いております. k-s.booth.pm
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
使用機材
本ブログで使用する地デジチューナでは,地上デジタル放送の取得しか対応していないため,BS放送やCS放送の取得はできません.
BS放送の録画をしたい場合は,PX-Q3U4*1など,BS放送の取得にも対応したチューナを用意する必要があります.
密林でPX-Q3U4の値段見たら高くて泣いちゃったあ.
- Raspberry Pi 3 Model B+ オタクの家ならどっかに転がってる.
- アンテナケーブル.その辺で売ってる.
- 地デジチューナ.以下は本ブログで使用する例. www.plex-net.co.jp
- ICカードリーダ.B-CASカードを読み込むのに使う.以下は本ブログで使用する例.オタクの家にはほぼ確実にあるらしい. www.identiv.co.jp
- B-CASカード.何とかして手に入れる. www.b-cas.co.jp
- 外付けHDD.本ブログでは7200 rpm容量1 TBのHDDを壊れたPCからぶっこ抜き,USB2.0でデータ転送を行い使用しています.
- DC電源.ラズパイへの電源供給に使う.本ブログでは5年くらい前のiPad miniに付属していたDC電源(出力5V2.1A)を用いています.Raspberry Pi3B+が推奨する電源は2A以上とされていますが,できれば3Aくらい出力できるものを推奨します.
この次について
いよいよ環境構築をしていきたいと思います.次回↓ miyakonorth.hatenablog.jp