雑多物ストア

内容に一貫性は無く雑多です.暇潰しで弄った工作物のメモ書きや旅行した際の写真を置くことがメインになると思います.

雑多物ストア

環境構築のメモとかをして容量2bitの頭を補完する場所.
後は旅行の際の写真を上げたり.
内容に一貫性は無く雑多になってます.

本ブログについて

ブログのタイトルについて

製造業において,工場内で生産された完成品の置き場を「ストア」と呼ぶことがあります(主に自動車業界でそう呼ぶらしい).本ブログは,備忘録や旅行の写真など,雑多物を置く場所という意味合いにしたかったことから上のタイトルとしています.

ブログの内容

環境構築やアルゴリズムに関する備忘録,旅行した際の写真の記録を中心に上げていきたいと考えています.

ブログの管理人

陽キャになるには自己肯定感や周囲の雰囲気に対する即応性(要するにノリ*1)が無さ過ぎるし, オタクになるには探究心と執着心,サーベイ能力が無さ過ぎる.

【備忘録】ラズパイを使った録画サーバの構築

ラズパイを使った録画サーバの構築

banana
Raspberry Pi 3 Model B+

新型コロナウイルスに伴う非常事態宣言下*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+

目次

miyakonorth.hatenablog.jp

miyakonorth.hatenablog.jp

miyakonorth.hatenablog.jp

miyakonorth.hatenablog.jp

miyakonorth.hatenablog.jp

【備忘録】ラズパイを使った録画サーバの構築 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のインストール

github.com

デジタル放送におけるアクセス制御方式の規格ARIB STD-B25*1Linuxで使用するためのライブラリです.

$ git clone https://github.com/stz2012/libarib25.git
$ cd libarib25
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ sudo make install -j4

recdvbのインストール

github.com

$ 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のインストール

nodejs.org

nodejs.org

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.com

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.com

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などと表示されているかと思います.

result
出力結果

以上で録画環境の構築は完了です.

環境による個人的な都合

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+

エンコード周りの構築

エンコードにはFFmpegを使用します.

www.ffmpeg.org

まず,エンコード周りについて調べていたら宇宙猫*1と化しました.
とは言え環境構築をしないと何も始まらないので,各フォーマットにおけるメリットやデメリット等のサーベイは取り敢えず保留し,思考停止でH.264の規格でエンコードすることにします.
H.264の規格でエンコードするにはx264が便利らしいので,x264に対応させた形でFFmpegをビルドします.

www.videolan.org

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のインストール

www.videolan.org

この辺記憶が曖昧で,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

ライブラリの再読み込み

$ 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をビルドする

crontabコマンドについてまとめました 【Linuxコマンド集】

cronでffmpeg - Qiita

cron の設定ガイド

H.264でエンコード:tech.ckme.co.jp

cronでffmpeg - Qiita

ffmpeg で H.264 エンコーディングの動画を作る - akihiko’s tech note

【備忘録】ラズパイを使った録画サーバの構築 2回(チューナ周り準備編)

ラズパイを使った録画サーバの構築(チューナ周り準備編)

前回の続き.前回↓ miyakonorth.hatenablog.jp

本ブログ記事の環境構築等に関しましてはきじのしっぽ様による以下の解説書を参考とさせて頂いております.

k-s.booth.pm

本ブログ記事での環境

環境 バージョン
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

参考

PX-S1UDとPT3のDVBドライバがLinux標準に – 底辺迷走

【備忘録】ラズパイを使った録画サーバの構築 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内の別のマシンからアクセスできるようにする

↓だいたいこんな感じのものを想定しています.

banana
banana

ラズパイで録画,エンコードした番組をUSB2.0で繋いだ外付けHDDに保存し,LAN内の違うマシンから保存した番組を閲覧することを想定しています. 以下の記事を参考に構築.

SambaでLinuxとWindowsとの間でファイル共有 - Qiita

この次にやること

番組を取得するための環境づくりを始めたいと思います.次回↓ miyakonorth.hatenablog.jp

参考

Raspbian / DebianからGUIを削除するにはどうすればよいですか?

SambaでLinuxとWindowsとの間でファイル共有 - Qiita

【備忘録】ラズパイを使った録画サーバの構築 0回(機材準備編)

ラズパイを使った地上波録画サーバの構築(機材準備編)

f:id:MiyakoNorth:20200508201015j:plain

本記事は機材準備編となります.

本ブログ記事における機材準備に関しましては,きじのしっぽ様による以下の解説書を参考とさせて頂いております. 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