備忘録

趣味に生きるオタクの備忘録

RaspiでRadikoの録音鯖的なのを立ててみる

最近よくRadikoを聞くことがあって、録音とデータハンドリングを少し考えたくなったのでやってみた次第。

RTMPdumpでデータを取ってきて、ffmpegで変換して保存するスクリプトが公開されていたので、これを使います。
データはNFSで拾えるように設定する感じです。
結局sambaで共有ディレクトリ化しました・・・


使うハードはこれ。
f:id:hu2mmc:20200510144122j:plain
f:id:hu2mmc:20200510144130j:plain
Raspberry Pi Type B 512MB

これでも、イーサはありますし、音声データをハンドルする程度なら問題ないと思うわけです。なにより、消費電力も少ないでしょうし発熱も少ないはずです。(余っていたのもありますし、電力的にも狙い)コイツをradikoの録音用としてぶっ立てておけば録音忘れもない・・はずと思いたい次第。

Release date: 2020-02-13のRaspbianを動かしてます。一応素性を少しペタっと。
ところで最近のRaspbianではSSHがDefault無効になっているので、/boot以下に"ssh"という、ディレクトリかファイルを作っておくとGoodです。

pi@raspberrypi:~ $ uname -a

Linux raspberrypi 4.19.97+ #1294 Thu Jan 30 13:10:54 GMT 2020 armv6l GNU/Linux
pi@raspberrypi:~ $ cat /proc/cpuinfo
processor : 0
model name : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 697.95
Features : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7

Hardware : BCM2835
Revision : 000e
Serial : 00000000********
Model : Raspberry Pi Model B Rev 2

一応、時間設定だけは要確認・・・(ドジった)

pi@raspberrypi:~ $ date
2020年 5月 9日 土曜日 21:52:21 JST


録音して、変換するところまで一括になっている、matchy2氏作成のスクリプトを使わせて頂きます。
簡易Radiko録音スクリプト · GitHub

シェルの取得

pi@raspberrypi:~ $ git clone https://gist.github.com/3956266.git
Cloning into '3956266'...
remote: Enumerating objects: 39, done.
remote: Total 39 (delta 0), reused 0 (delta 0), pack-reused 39
Unpacking objects: 100% (39/39), done.

pi@raspberrypi:~/3956266 $ ls -al

  • rw-r--r-- 1 pi pi 3384 5月 9 23:04 rec_radiko.sh

実行前に、いくつかRaspbianで標準で足りないPackageがありますね。
すべてaptで取得できました。

swfextract

sudo apt install swftools

xmllint

sudo apt install libxml2-utils

rtmpdump

sudo apt install rtmpdump

ffmpeg

sudo apt install ffmpeg

さて、シェルスクリプトを実行してみます。

pi@raspberrypi:~/3956266 $ source rec_radiko.sh
usage : -bash channel_name duration(minuites) [outputdir] [prefix]

usage的に、"channel_name"とあるのは局名です。下記リンクに名称がズラっと並んでいます。
radikomemo - foltia - Trac

channel_nameと、録音時間(duration)、出力先(outputdir)を設定すればよさそうです。


ためしに、Bayfmを1分間録音してみました。

pi@raspberrypi:~/3956266 $ time source rec_radiko.sh BAYFM78 1 /home/pi/upload
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: No application or playpath in URL!
Connecting ...
WARNING: Trying different position for server digest!
INFO: Connected...
Starting Live Stream
For duration: 60.000 sec
INFO: Metadata:
365.679 kB / 60.03 sec
Download complete

real 2m17.814s
user 0m44.996s
sys 0m1.146s
pi@raspberrypi:~/upload $ ls -alh

  • rw-r--r-- 1 root root 940K 5月 10 02:57 BAYFM78_2020-05-10-02_55.mp3

なるほど。局名と日付が入るのであとは適当にディレクトリだけ指定しておけばよさそうです。
ただ、mp3への変換時間が大変長いですね。1分の録音で、録音+変換で3分くらいかかっているみたいです。ちょっと遅い?

10分で試してみました。

pi@raspberrypi:~/3956266 $ time source rec_radiko.sh BAYFM78 10

real 22m54.919s
user 6m22.589s
sys 0m4.328s

 → 約30分

pi@raspberrypi:~/3956266 $ time source rec_radiko.sh BAYFM78 20

real 48m33.351s
user 14m10.091s
sys 0m8.712s

 → 約63分


トータルで、録音時間+録音時間x2?くらいの時間は掛かりますね。
1時間番組を録ったら、出来上がるのは放送開始の3時間後。Raspberry Piの初代、ARM11アーキテクチャで700MHz、さすがにmp3のエンコードffmpegで掛けているのは重いのでしょう。


ただ、topコマンドでrtmpdump後のffmpegの使用率をcheckしたところ50%程度しか食っていない様子でした。

top | grep ffmpeg


26153 root 20 0 146192 13192 11380 R 13.9 3.0 0:00.43 ffmpeg
26153 root 20 0 146200 15052 12496 R 48.1 3.4 0:01.94 ffmpeg
26153 root 20 0 149932 34600 26424 R 48.7 7.8 0:03.48 ffmpeg
26153 root 20 0 149932 34632 26424 R 48.9 7.8 0:05.01 ffmpeg
26153 root 20 0 149932 34668 26424 R 47.9 7.8 0:06.52 ffmpeg
26153 root 20 0 149932 34700 26424 R 48.6 7.8 0:08.07 ffmpeg

じゃあ2本同時にエンコするとどうなるか?ってことで同じくtopで測ると

top | grep ffmpeg


11876 root 20 0 151724 34924 24620 R 22.9 7.9 35:43.40 ffmpeg
17478 root 20 0 153600 36708 24644 R 22.9 8.3 68:35.17 ffmpeg
11876 root 20 0 151724 34924 24620 R 31.7 7.9 35:44.44 ffmpeg
17478 root 20 0 153600 36708 24644 R 31.7 8.3 68:36.21 ffmpeg
11876 root 20 0 151828 34928 24620 R 31.6 7.9 35:45.48 ffmpeg
17478 root 20 0 153600 36708 24644 R 31.6 8.3 68:37.25 ffmpeg
11876 root 20 0 151828 34928 24620 R 31.0 7.9 35:46.49 ffmpeg
17478 root 20 0 153600 36708 24644 R 31.0 8.3 68:38.26 ffmpeg
11876 root 20 0 151828 34928 24620 R 31.4 7.9 35:47.52 ffmpeg
17478 root 20 0 153600 36708 24644 R 31.1 8.3 68:39.28 ffmpeg

うーん、30%+30%で60%ちょい?一応並列もできるみたい、、、条件は不明ながらも適当に使っているSDカードの速度とかも気にする必要あるかも。

さて、これをcronに登録して自動化してみましょう。

sudo service cron status

● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-05-09 21:46:10 JST; 4h 9min ago
Docs: man:cron(8)
Main PID: 223 (cron)
Memory: 508.0K
CGroup: /system.slice/cron.service
└─223 /usr/sbin/cron -f

5月 10 01:17:01 raspberrypi CRON[2335]: pam_unix(cron:session): session opened for user root by (uid=0)
5月 10 01:17:01 raspberrypi CRON[2347]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
5月 10 01:17:01 raspberrypi CRON[2335]: pam_unix(cron:session): session closed for user root
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

事前設定として録音シェルスクリプトに実行権限を与えないと、動きません。

chmod 755 rec_radiko.sh

cronの設定は少し手間取りました。Netにある情報とmanを頼りにやりましたが、シェルの実行権限はもとい、cronに実行するユーザ名を与えないと

May 10 02:29:57 raspberrypi cron[12257]: Error: bad username; while reading /etc/cron.d/cron_radiko_test
May 10 02:29:57 raspberrypi cron[12257]: (*system*cron_radiko_test) ERROR (Syntax error, this crontab file will be ignored)

こんなErrorが出ます。

結果的に、cronの設定ファイルは下記のようにしました。

sudo vi /etc/cron.d/cron_radiko_test

00 09 * * 0 root /home/pi/3956266/rec_radiko.sh STR_NAME 61 /home/pi/upload/

HH:MMが逆なのがポイントですね。また、0 sun、1 mon・・・、6 satといった具合にして5つ目の引数に数字を入れると、曜日指定ができます。
6つ目の引数のrootが、cronが実行するときのユーザ名になるみたいです。

cronの設定ファイルを修正したら、かならずserviceをリスタート。

sudo service cron restart

んでもって、このディレクトリ(/home/pi/upload/)に録音ファイルが溜まっていくので、吸いだせるようにNFSでUploadできるように設定します。まずは、NFSサーバにするためのパッケージをインストール。

sudo apt install nfs-kernel-server

Installすると、Serviceとして勝手に起動するみたいです。

先ほどのパスを、NFS公開ディレクトリに設定します。

sudo vi /etc/exports


/home/pi/upload 192.168.11.0/255.255.255.0(rw,sync,no_subtree_check,no_root_squash)


さて、今回はWindows 10 proからNFSディレクトリを覗くので下記の設定をします。
f:id:hu2mmc:20200510114745p:plainf:id:hu2mmc:20200510114800p:plain

マウントは、Linuxと同じようにコマンドプロンプトから実施します。マウントドライブのドライブ文字は適当に。

>mount 192.168.***.***:/home/pi/upload X:
X: は 192.168.***.***:/home/pi/upload に正常に接続しました

コマンドは正常に終了しました。

これで、Raspi側の公開ディレクトリが見えるようになり、128kbpsのmp3ファイルが覗けました。あるとすれば、容量の問題でしょうかね。1時間で60MBくらいになるので、100時間=6GB?今は8GBのSDに焼いているので、USBメモリか別媒体、定期的な吸出しを考えるかなぁ・・・