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

 とりあえず、Raspiで「らじる★らじる」を聞いてみるか。

 AMのNHKラジオがradikoで再配信されているのは知らなかったけど、radikoのストリームは認証がヤヤコシくて、ちょっと使う気になれない。

 NHKの独自再配信の「らじる★らじる」は比較的簡単にデータを利用できそうだ。ただし、こちらはリアルタイム配信に限られる。

 比較的最近の記事があるので、その情報を使わせてもらう。

第63回 最近の『らじる★らじる』(その1) | gihyo.jp
https://gihyo.jp/article/2025/11/zoku-gansiki-0063

 放送中のものをストリーミング再生をするだけなので、細かい情報はいらない。  ニュースはローカルが流れたほうがいいか。以下から各地域のストリームURLがわかるのだけど、残念ながら札幌、仙台、東京、名古屋、大阪、広島、松山、福岡しかない。

https://www.nhk.or.jp/radio/config/config_web.xml

 しょうがないので名古屋にしておく。

<data>
<areajp>名古屋</areajp>
<area>nagoya</area>
<apikey>300</apikey>
<areakey>230</areakey>
<r1hls>
https://simul.drdi.st.nhk/live/10/joined/master.m3u8
</r1hls>
<r2hls>
https://simul.drdi.st.nhk/live/4/joined/master.m3u8
</r2hls>
<fmhls>
https://simul.drdi.st.nhk/live/11/joined/master.m3u8
</fmhls>
</data>

 試しにmacOS上のvlcから再生してみる。普通に再生できる。当たり前だけど、AMで聞くよりはるかに音質がいいねw 第二放送もFMもちゃんと聞けた。

 ただ、このURLはたまに変わるらしい。悩ましいところだけど、今回はハードコードで行く。

 配信はHTTP Live Streaming(HLS)なので、それを受けられるCLIプレーヤーを使うだけ。mpv, vlc, ffplayなどが対応している。

 Pi3Aをセットアップ。電源を入れる。パッケージDBの更新と、パッケージのアップデートをやっておく。
 再生ツールは、とりあえず、mpvでいいかな。音量は、mpv内部のソフトウェア音量(softvol)で制御する。再生中に9/0キーで調整できるほか、起動時に--volume=50などとオプションをつける。

 インストール。結構依存がある。

kinneko@radio:~ $ sudo apt install -y mpv
Installing:
  mpv

Installing dependencies:
  adwaita-icon-theme          libpangocairo-1.0-0
  at-spi2-common              libpangoft2-1.0-0
  at-spi2-core                libpgm-5.3-0t64
  dconf-gsettings-backend     libpipewire-0.3-0t64
  dconf-service               libpipewire-0.3-common
  ffmpeg                      libpixman-1-0
  fontconfig                  libplacebo349
  fontconfig-config           libpocketsphinx3
  fonts-dejavu-core           libpostproc58
  fonts-dejavu-mono           libpulse0
  gsettings-desktop-schemas   librabbitmq4
  gtk-update-icon-cache       librav1e0.7
  hicolor-icon-theme          libraw1394-11
  libaacs0                    librist4
  libabsl20240722             librsvg2-2
  libaom3                     librsvg2-common
  libarchive13t64             librubberband2
  libass9                     libsdl2-2.0-0
  libasyncns0                 libsensors-config
  libatk-bridge2.0-0t64       libsensors5
  libatk1.0-0t64              libserd-0-0
  libatspi2.0-0t64            libshine3
  libauthen-sasl-perl         libsixel1
  libavahi-client3            libsm6
  libavc1394-0                libsnappy1v5
  libavcodec61                libsndfile1
  libavdevice61               libsndio7.0
  libavfilter10               libsodium23
  libavformat61               libsord-0-0
  libavutil59                 libsoxr0
  libbdplus0                  libspa-0.2-modules
  libblas3                    libspeex1
  libbluray2                  libsphinxbase3t64
  libbs2b0                    libsratom-0-0
  libcaca0                    libsrt1.5-gnutls
  libcairo-gobject2           libssh-4
  libcairo2                   libsvtav1enc2
  libcdio-cdda2t64            libswresample5
  libcdio-paranoia2t64        libswscale8
  libcdio19t64                libthai-data
  libchromaprint1             libthai0
  libcjson1                   libtheoradec1
  libclone-perl               libtheoraenc1
  libcloudproviders0          libtie-ixhash-perl
  libcodec2-1.2               libtimedate-perl
  libcolord2                  libtry-tiny-perl
  libcups2t64                 libtwolame0
  libdata-dump-perl           libudfread0
  libdatrie1                  libunibreak6
  libdav1d7                   liburi-perl
  libdc1394-25                libva-drm2
  libdecor-0-0                libva-wayland2
  libdecor-0-plugin-1-gtk     libva-x11-2
  libdisplay-info2            libva2
  libdrm-amdgpu1              libvdpau-va-gl1
  libdvdnav4                  libvdpau1
  libebur128-1                libvidstab1.1
  libegl-mesa0                libvorbisenc2
  libegl1                     libvorbisfile3
  libencode-locale-perl       libvpx9
  libepoxy0                   libvulkan1
  libfftw3-double3            libwayland-client0
  libfile-basedir-perl        libwayland-cursor0
  libfile-desktopentry-perl   libwayland-egl1
  libfile-listing-perl        libwayland-server0
  libfile-mimeinfo-perl       libwebpmux3
  libflite1                   libwebrtc-audio-processing-1-3
  libfont-afm-perl            libwww-perl
  libfontconfig1              libwww-robotrules-perl
  libfreetype6                libx11-protocol-perl
  libfribidi0                 libx11-xcb1
  libgbm1                     libx264-164
  libgdk-pixbuf-2.0-0         libx265-215
  libgdk-pixbuf2.0-bin        libxaw7
  libgdk-pixbuf2.0-common     libxcb-dri3-0
  libgfortran5                libxcb-glx0
  libgl1                      libxcb-present0
  libgl1-mesa-dri             libxcb-randr0
  libgles2                    libxcb-render0
  libglvnd0                   libxcb-shape0
  libglx-mesa0                libxcb-shm0
  libglx0                     libxcb-sync1
  libgme0                     libxcb-xfixes0
  libgraphite2-3              libxcomposite1
  libgsm1                     libxcursor1
  libgtk-3-0t64               libxdamage1
  libgtk-3-bin                libxfixes3
  libgtk-3-common             libxft2
  libharfbuzz0b               libxi6
  libhtml-form-perl           libxinerama1
  libhtml-format-perl         libxkbcommon0
  libhtml-parser-perl         libxkbfile1
  libhtml-tagset-perl         libxml-parser-perl
  libhtml-tree-perl           libxml-twig-perl
  libhttp-cookies-perl        libxml-xpathengine-perl
  libhttp-daemon-perl         libxmu6
  libhttp-date-perl           libxpm4
  libhttp-message-perl        libxpresent1
  libhttp-negotiate-perl      libxrandr2
  libhwy1t64                  libxrender1
  libice6                     libxshmfence1
  libiec61883-0               libxss1
  libio-compress-brotli-perl  libxt6t64
  libio-html-perl             libxtst6
  libio-socket-ssl-perl       libxv1
  libio-stringy-perl          libxvidcore4
  libipc-system-simple-perl   libxxf86dga1
  libjack-jackd2-0            libxxf86vm1
  libjxl0.11                  libz3-4
  liblapack3                  libzimg2
  liblcms2-2                  libzix-0-0
  liblilv-0-0                 libzmq5
  libllvm19                   libzvbi-common
  liblua5.2-0                 libzvbi0t64
  liblwp-mediatypes-perl      luit
  liblwp-protocol-https-perl  mesa-libgallium
  libmailtools-perl           mesa-va-drivers
  libmbedcrypto16             mesa-vdpau-drivers
  libmp3lame0                 mesa-vulkan-drivers
  libmpg123-0t64              ocl-icd-libopencl1
  libmujs3                    perl-openssl-defaults
  libmysofa1                  pocketsphinx-en-us
  libnet-dbus-perl            python3-mutagen
  libnet-http-perl            python3-websockets
  libnet-smtp-ssl-perl        va-driver-all
  libnet-ssleay-perl          vdpau-driver-all
  libnorm1t64                 x11-common
  libopenal-data              x11-utils
  libopenal1                  x11-xserver-utils
  libopenjp2-7                xdg-utils
  libopenmpt0t64              yt-dlp
  libopus0                    zutty
  libpango-1.0-0

Suggested packages:
  adwaita-icon-theme-legacy  liblcms2-utils         libregexp-ipv6-perl
  ffmpeg-doc                 libcrypt-ssleay-perl   libauthen-ntlm-perl
  lrzip                      libportaudio2          libunicode-map8-perl
  libdigest-hmac-perl        opus-tools             libunicode-string-perl
  libgssapi-perl             pipewire               xml-twig-tools
  libcuda1                   pulseaudio             opencl-icd
  libnvcuvid1                libraw1394-doc         debhelper
  libnvidia-encode1          librsvg2-bin           python-mutagen-doc
  libbluray-bdj              lm-sensors             nvidia-vdpau-driver
  colord                     serdi                  mesa-utils
  cups-common                sndiod                 nickle
  libdvdcss2                 sordi                  cairo-5c
  libfftw3-bin               speex                  xorg-docs-core
  libfftw3-dev               libsub-name-perl       libfribidi-bin
  gvfs                       libbusiness-isbn-perl  | bidiv
  jackd2                     libmime-base32-perl    phantomjs

Summary:
  Upgrading: 0, Installing: 266, Removing: 0, Not Upgrading: 0
  Download size: 188 MB
  Space needed: 613 MB / 55.4 GB available
(snip)

 再生してみる。

kinneko@radio:~ $ mpv 'https://simul.drdi.st.nhk/live/10/joined/master.m3u8'
[ffmpeg] https: Cannot reuse HTTP connection for different host: simul.drdi.st.nhk:-1 != simulosa.drdi.st.nhk:-1
[ffmpeg/demuxer] hls: keepalive request failed for 'https://simulosa.drdi.st.nhk/live/10/joined/audio/media.m3u8' with error: 'Invalid argument' when parsing playlist
● Audio  --aid=1  (aac 2ch 48000 Hz 96 kbps)
○ Audio  --aid=2  (aac 2ch 48000 Hz 96 kbps)
[W][16:57:49.295945] pw.conf      | [          conf.c: 1182 try_load_conf()] can't load config client.conf: No such file or directory
[E][16:57:49.299354] pw.conf      | [          conf.c: 1215 pw_conf_load_conf_for_context()] can't load config client.conf: No such file or directory
AO: [alsa] 48000Hz stereo 2ch float
[ffmpeg] https: Cannot reuse HTTP connection for different host: simulosa.drdi.st.nhk:-1 != simul.drdi.st.nhk:-1
[ffmpeg/demuxer] hls: keepalive request failed for 'https://simul.drdi.st.nhk/live/10/joined/audio/media.m3u8' with error: 'Invalid argument' when parsing playlist
A: 00:00:26 / 00:00:51 (52%) Cache: 24s/901KB

 当たり前だけど、音は出ているね。
 このピロースピーカーは枕に仕込むためのものなので、音がかなり小さい。0キーを押すとコンソール上で音量を%表示して2%づつ音が大きくなる。9キーで同様に音が小さくなる。100%でいっぱいかとおもいきや、最大値は130%だった。

 ffmpegのエラーは、HLS(m3u8)のプレイリスト内で参照先ホストがsimul.drdi.st.nhk ↔ simulosa.drdi.st.nhkと切り替わっている警告。このとき FFmpeg の「HTTP接続を使い回す(keep-alive/persistent)」挙動だと、別ホストには同じ接続を再利用できないので警告が出る。運用上はとくに問題はない。
 ffmpeg/demuxerのエラーは、上の「接続再利用ができない」状況で、HLSデマルチプレクサがkeep-alive接続を使った更新に失敗し、新規接続でのリトライに回っているために出る警告。再生が続いていれば問題はない。
 FFmpeg(HLS)のhttp_persistentを切る設定(--demuxer-lavf-o=http_persistent=0)をすると、この種の警告が減るという報告があったけれど、特に問題が出ていないので放置。

 もう1つのpw.confの警告は、PipeWireクライアント設定であるclient.confが見つからないというもの。これはPipeWireが見つからないので、alsaにフォールダウンしているので問題ない。明示でalsaを指定する(--ao=alsa)と出なくなると思われる。こちらも特に問題が出ていないので放置でいいだろう。

 とりあえず、耐久試験で、そのまま数時間放置してみる。

 20分くらいで、なんか止まった。10秒くらい後に再生再開した。万能ではないねw
 その時のログはこんな感じ。

[ffmpeg/demuxer] hls: keepalive request failed for 'https://simul.drdi.st.nhk/live/10/joined/audio/media.m3u8' with error: 'Invalid argument' when parsing playlist
Audio device underrun detected.
[ffmpeg] tls: Error in the pull function.
[ffmpeg] tls: IO error: Connection timed out
[ffmpeg/demuxer] hls: Failed to reload playlist 0
[ffmpeg] tls: The specified session has been invalidated for some reason.
[ffmpeg/demuxer] hls: keepalive request failed for 'https://simul.drdi.st.nhk/live/10/joined/audio/media.m3u8' with error: 'Input/output error' when parsing playlist
[lavf] error reading packet: Invalid data found when processing input.

 HLSのプレイリスト更新(m3u8の再取得)が通信エラーで止まり、結果として音声データが途切れてデコーダも壊れた入力として扱った感じ。対策としては、オプションで固めることになりそう。

 ・HTTP接続の使い回しを切る(--demuxer-lavf-o=http_persistent=0)  ・バッファを増やして瞬断に強くする(--cache=yes --cache-secs=30 --demuxer-readahead-secs=30)  ・FFmpeg側の再接続を有効化(--stream-lavf-o=reconnect=1,reconnect_streamed=1,reconnect_delay_max=5)  ・タイムアウト長めにする(--stream-lavf-o=rw_timeout=20000000:単位はマイクロ秒)

 CPUでの処理が詰まってもunderrunが出ることはあるけれど、今回はそんなに負荷がかかってはいないだろうから、これが原因ではない。

 一時間くらいで、途切れたのは一回だけ。
 一旦停止して、以下を指定して、エイジングテストを継続。

kinneko@radio:~ $ 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 --stream-lavf-o=rw_timeout=20000000 --ao=alsa
● Audio  --aid=1  (aac 2ch 48000 Hz 97 kbps)
○ Audio  --aid=2  (aac 2ch 48000 Hz 97 kbps)
AO: [alsa] 48000Hz stereo 2ch float
A: 00:00:09 / 00:00:30 (30%) Cache: 21s/790KB

 警告系の表示は抑制された感じ。


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