AMラジオを病室で聴く -3-

 エイジングしてみたが、とりあえず、このくらいは問題なく動いている。

A: 15:53:46 / 15:54:01 (100%) Cache: 14s/538KB

 昨夜の夜中は昭和アニメのテーマソング特集で安眠を妨害されたw そういう世代が聞くということは、すでに私もターゲットスコープに入っているということなのかな?

 時報を聞くと30秒くらいの遅延があるのだけど、これはそもそものエンコードと配信の遅延もあるので、そんなものではなかろうか。キャッシュの表示では10-30secという感じ。設定でキャッシュを30secにしているので、リアルタイム性は毀損している。

 18hくらいでこんなエラーが出た。回線やサーバ都合でHLSが不連続になり、音声が途切れたようだ。

Audio device underrun detected.
[ffmpeg/demuxer] hls: Media sequence changed unexpectedly: 852750 -> 852701

 Audio device underrun detected.」は、受信が間に合わず再生バッファが空になったというエラー。体感で音声が途切れた感じはしないので、間に合っているようだ。

「hls: Media sequence changed unexpectedly: 852750 -> 852701」は、HLS の #EXT-X-MEDIA-SEQUENCE(セグメント番号)が、通常は単調増加するはずなのに 逆方向に飛んだ(852750 から 852701 に戻った)というエラー。
 プレイリストの再取得が失敗->古いm3u8を掴んだ / CDNの別ノードに切り替わって巻き戻ったか、回線瞬断で再接続した結果、サーバ側が別のプレイリストを返した、ライブ側のプレイリストがリセット/入れ替えになったという感じ。

 いずれにせよ、送り出しが間に合ってないエラーはローカル側ではどうしようもないね。

 動作中のCPU使用は8.3%くらいなので、ほとんど負荷になっていない。たぶん、Pi2でもPiZeroでも楽勝ではないかな。

 あ、エイジング24hを目前にして、落ちた。

[ffmpeg/demuxer] hls: Media sequence changed unexpectedly: 854428 -> 854427
[ffmpeg] tcp: Failed to resolve hostname simul.drdi.st.nhk: Temporary failure in name resolution
[ffmpeg/demuxer] hls: Failed to reload playlist 0
[ffmpeg] tcp: Failed to resolve hostname simul.drdi.st.nhk: Temporary failure in name resolution
[ffmpeg/demuxer] hls: Failed to reload playlist 0
A: 23:03:45 / 23:03:45 (100%) Cache: 0.0s
Exiting... (End of file)

 「Failed to resolve hostname」って、名前解決ができなかったって、どういうことやねん... そして落ちるのね。sshは切れてないのね。無線の問題ではなさそう。やっぱPi3Bとかにして有線接続がいいかもしれない。
 自動再接続のオプション(--stream-lavf-o=reconnect=1,reconnect_streamed=1,reconnect_delay_max=5)は有効になっているのだけどな。

 とりあえず、うまく動作はしているので、サービス化しておく。
 ROM化を前提に、サービス化したときのログを抑制する。

 まずは、mpvのオプションを付ける。

--no-terminal:ステータス行(A: ... Cache: ...)やTTY制御を止める  
--really-quiet:ログを極力出さない(エラーもかなり抑える)

 音声だけなので、--no-videoも有効かな。

 サービス化したときのログを抑制するために、unitで標準出力/標準エラーをぜんぶ捨てる。障害解析のログは残らないけど、ROM化には都合がいい。

[Service]
StandardOutput=null
StandardError=null
kinneko@radio:~ $ which mpv
/usr/bin/mpv

 サービスファイルを作って、自動起動するようにする。

kinneko@radio:~ $ sudo vi /etc/systemd/system/nhk-r1.service
[Unit]
Description=NHK Radio 1 (Radiru) player
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/mpv mpv 'https://simul.drdi.st.nhk/live/10/joined/master.m3u8' --volume=130 --demuxer-lavf-o=http_persistent=0 --cache=yes --cache-secs=30 --demuxer-readahead-secs=30 --stream-lavf-o=reconnect=1,reconnect_streamed=1,reconnect_delay_max=5,rw_timeout=20000000 --ao=alsa --network-timeout=10 --force-window=no --no-terminal --really-quiet --no-video
Restart=always
RestartSec=2
StandardOutput=null
StandardError=null

[Install]
WantedBy=multi-user.target

 有効化する。

kinneko@radio:~ $ sudo systemctl daemon-reload
kinneko@radio:~ $ sudo systemctl enable --now nhk-r1.service
Created symlink '/etc/systemd/system/multi-user.target.wants/nhk-r1.service' → '/etc/systemd/system/nhk-r1.service'.

 音は出てきた。

 ログは一切出していないので、サービスの起動ログで再起動を確認するしかない。

kinneko@radio:~ $ sudo journalctl -u nhk-r1.service -b -n 200 --no-pager
Dec 26 17:13:01 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.

 システムをROM化しておく。

kinneko@radio:~ $ sudo raspi-config nonint enable_overlayfs
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  cryptsetup cryptsetup-bin
Suggested packages:
  cryptsetup-initramfs keyutils haveged
The following NEW packages will be installed:
  cryptsetup cryptsetup-bin overlayroot
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 742 kB of archives.
After this operation, 3,369 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian trixie/main arm64 cryptsetup-bin arm64 2:2.7.5-2 [497 kB]
Get:2 http://deb.debian.org/debian trixie/main arm64 cryptsetup arm64 2:2.7.5-2 [230 kB]
Get:3 http://deb.debian.org/debian trixie/main arm64 overlayroot all 0.18.debian14 [15.6 kB]
Fetched 742 kB in 1s (1,168 kB/s)
Preconfiguring packages ...
Selecting previously unselected package cryptsetup-bin.
(Reading database ... 72863 files and directories currently installed.)
Preparing to unpack .../cryptsetup-bin_2%3a2.7.5-2_arm64.deb ...
Unpacking cryptsetup-bin (2:2.7.5-2) ...
Selecting previously unselected package cryptsetup.
Preparing to unpack .../cryptsetup_2%3a2.7.5-2_arm64.deb ...
Unpacking cryptsetup (2:2.7.5-2) ...
Selecting previously unselected package overlayroot.
Preparing to unpack .../overlayroot_0.18.debian14_all.deb ...
Unpacking overlayroot (0.18.debian14) ...
Setting up cryptsetup-bin (2:2.7.5-2) ...
Setting up cryptsetup (2:2.7.5-2) ...
Setting up overlayroot (0.18.debian14) ...
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for initramfs-tools (0.148.3+rpt2) ...
update-initramfs: Generating /boot/initrd.img-6.12.47+rpt-rpi-v8
'/boot/initrd.img-6.12.47+rpt-rpi-v8' -> '/boot/firmware/initramfs8'
update-initramfs: Generating /boot/initrd.img-6.12.47+rpt-rpi-2712
'/boot/initrd.img-6.12.47+rpt-rpi-2712' -> '/boot/firmware/initramfs_2712'
kinneko@radio:~ $ sudo raspi-config nonint enable_bootro
kinneko@radio:~ $ sudo reboot
kinneko@radio:~ $ Connection to 192.168.0.16 closed by remote host.

 再起動しても、ラジオ音声の再生ができている。

 rootもbootもroに設定されている。

kinneko@radio:~ $ cat /proc/mounts |grep root
/dev/mmcblk0p2 /media/root-ro ext4 ro,relatime 0 0
tmpfs-root /media/root-rw tmpfs rw,relatime 0 0
overlayroot / overlay rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_,uuid=on 0 0

kinneko@radio:~ $ cat /proc/mounts |grep boot
/dev/mmcblk0p1 /boot/firmware vfat ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro 0 0

 あとは数日回して落ちなければいいかな。

 エイジングすると、1日一回落ちている。

kinneko@radio:~ $ sudo journalctl -u nhk-r1.service -b -n 200 --no-pager
Dec 26 17:27:04 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.
Dec 27 17:27:42 radio systemd[1]: nhk-r1.service: Deactivated successfully.
Dec 27 17:27:42 radio systemd[1]: nhk-r1.service: Consumed 2h 1min 23.013s CPU time.
Dec 27 17:27:44 radio systemd[1]: nhk-r1.service: Scheduled restart job, restart counter is at 1.
Dec 27 17:27:44 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.
Dec 27 17:27:54 radio systemd[1]: nhk-r1.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 27 17:27:54 radio systemd[1]: nhk-r1.service: Failed with result 'exit-code'.
Dec 27 17:27:54 radio systemd[1]: nhk-r1.service: Consumed 7.024s CPU time.
Dec 27 17:27:56 radio systemd[1]: nhk-r1.service: Scheduled restart job, restart counter is at 2.
Dec 27 17:27:56 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.
Dec 27 17:28:03 radio systemd[1]: nhk-r1.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 27 17:28:03 radio systemd[1]: nhk-r1.service: Failed with result 'exit-code'.
Dec 27 17:28:03 radio systemd[1]: nhk-r1.service: Consumed 6.498s CPU time.
Dec 27 17:28:05 radio systemd[1]: nhk-r1.service: Scheduled restart job, restart counter is at 3.
Dec 27 17:28:05 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.
Dec 28 17:28:47 radio systemd[1]: nhk-r1.service: Deactivated successfully.
Dec 28 17:28:47 radio systemd[1]: nhk-r1.service: Consumed 2h 4min 37.742s CPU time.
Dec 28 17:28:49 radio systemd[1]: nhk-r1.service: Scheduled restart job, restart counter is at 4.
Dec 28 17:28:49 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.
Dec 28 17:28:59 radio systemd[1]: nhk-r1.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 28 17:28:59 radio systemd[1]: nhk-r1.service: Failed with result 'exit-code'.
Dec 28 17:28:59 radio systemd[1]: nhk-r1.service: Consumed 7.058s CPU time.
Dec 28 17:29:01 radio systemd[1]: nhk-r1.service: Scheduled restart job, restart counter is at 5.
Dec 28 17:29:01 radio systemd[1]: Started nhk-r1.service - NHK Radio 1 (Radiru) player.

 ぜんぶ5時半前か。24h動かない訳がありそう。サービスは再起動で復旧しているので実用上は問題なさそう。

 ログを止めるのは早計だったか。復帰する。

 起動オプションから--really-quietを削る。

kinneko@radio:~ $ sudo vi /etc/systemd/system/nhk-r1.service
ExecStart=/usr/bin/mpv 'https://simul.drdi.st.nhk/live/10/joined/master.m3u8' --volume=130 --demuxer-lavf-o=http_persistent=0 --cache=yes --cache-secs=30 --demuxer-readahead-secs=30 --stream-lavf-o=reconnect=1,reconnect_streamed=1,reconnect_delay_max=5,rw_timeout=20000000 --ao=alsa --network-timeout=10 --force-window=no --no-terminal --no-video

 以下削る。

StandardOutput=null
StandardError=null

 一応再起動にしておくか。

kinneko@radio:~ $ sudo systemctl daemon-reload
kinneko@radio:~ $ sudo reboot

 ログ出てないな... あ、ROM化してたんだった...

 とりあえず、サービスの再起動でいいか。

kinneko@radio:~ $ sudo vi /etc/systemd/system/nhk-r1.service
kinneko@radio:~ $ sudo systemctl daemon-reload
kinneko@radio:~ $ sudo systemctl restart nhk-r1.service

 あんまりログでないな。--no-terminalも外して、-vも入れておくか。
 ちょっとログが出過ぎている。[statusline]を出さないように調整する。--term-status-msg=を追記する。値は入れなくていいようだ。

 「[cplayer] Running hook: ytdl_hook/on_load」が出ているので、--script-opts=ytdl_hook-try_ytdl=noオプションを追加して抑制したほうがよさそう。


オリジナル投稿: AMラジオを病室で聴く -3-|kinneko|pixivFANBOX
https://www.fanbox.cc/@kinneko/posts/11123077