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

AMのNHKラジオがradikoで再配信されているのは知らなかったけど、radikoのストリームは認証がヤヤコシくて、ちょっと使う気になれない。
NHKの独自再配信の「らじる★らじる」は比較的簡単にデータを利用できそうだ。ただし、こちらはリアルタイム配信に限られる。
比較的最近の記事があるので、その情報を使わせてもらう。
第63回 最近の『らじる★らじる』(その1) | gihyo.jp
https://gihyo.jp/article/2025/11/zoku-gansiki-0063
放送中のものをストリーミング再生をするだけなので、細かい情報はいらない。 ニュースはローカルが流れたほうがいいか。以下から各地域のストリームURLがわかるのだけど、残念ながら札幌、仙台、東京、名古屋、大阪、広島、松山、福岡しかない。
しょうがないので名古屋にしておく。
<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


