インターネット音楽を「mineo夜間フリー」で録音、昼間に「LAN内UDP配信」で複数台のPCで楽しむ方法(Linux)- streamripperとffmpegの活用

(追記 2026.2.23)pipewire を採用したRaspOS機では注意が必要だ。mpvによる再生で騒音を発したりcronを使ったmpv起動で追加の環境変数が必要だったりする。

ネット配信を録音する(streamripper)

ネット配信の音楽を録音したり、LAN内に再配信するには streamripper が便利だ。録音対象の URL を $TargetURL とすると、次のコマンドで /ホームディレクトリ/sripper に音楽ファイルが保存される。

① streamripper $TargetURL -z -s -d ~/sripper

-z - Don't scan for free ports if base port is not avail(あった方がよいだろう)
-s - Don't create a directory for each stream(次に指定するディレクトリに録音ファイルをまとめる)
-d dir - The destination directory(録音を保存するディレクトリ)
注意)-s がないと曲ごとにディレクトリが作られ煩雑になる。

streamripper には、単独でLAN内に再配信する機能もあり、対象の URL を $TargetURL とすると、次のコマンドで、LAN内(例②では3デバイスまで)に配信できる。(録音しながら配信する場合は -A を外す)

② streamripper $TargetURL -A -r -z -R 3

-A - Don't write individual tracks
-r [[ip:]port] - Create relay server on base ip:port, default port 8000
-R #connect - Max connections to relay, default 1, -R 0 is no limit

オプション -s があっても、録音時には対象ディレクトリ直下に incompleteディレクトリ が作られる。これは、Streamripperが先頭または末尾を特定できないトラックを仮に保存するディレクトリで、リッピングした最初と最後のトラックは通常ここに保存されている。-o でこの動作を変更できるが、詳しくは作者のサイトを参照されたい。

LAN内に配信する(ffmpeg)

streamripper自身にも配信機能はあるが、受信しながらの配信なので、今回の用途(mineo夜間フリーで録音し、昼間にLAN内に配信する)には適さない。今回採用したのは、ffmpeg による UDP配信で、1対1配信,マルチキャストアドレス配信およびローカルホスト配信の別がある。

① 1対1配信(再変換なしの場合)
(配信)ffmpeg -re -i 配信.aac -c:a copy -f mpegts udp://受信デバイスのIPアドレス:port
(受信)mpv udp://0.0.0.0:port

② マルチキャストアドレス配信(再変換なしの場合)※接続があれば別セグメントでも受信できる
(配信)ffmpeg -re -i 配信.aac -c:a copy -f mpegts udp://239.0.0.0:port
(受信)mpv udp://239.0.0.0:port

③ 同時にローカルホストへも配信する場合は、-map を指定して、tee で分ける
(配信)ffmpeg -re -i 配信.aac -c:a copy -f mpegts -map 0:a -f tee "[f=mpegts]udp://127.0.0.1:5678?pkt_size=1316|[f=mpegts]udp://239.0.0.0:1234?pkt_size=1316"
(受信)mpv udp://127.0.0.1:5678、mpv udp://239.0.0.0:1234

④ 連続配信は当該ディレクトリに移動して実施。(ディレクトリ内音楽ファイルが順に配信される)
(配信)for f in *.aac; do ffmpeg -re -i "$f" -c:a copy -f mpegts -map 0:a -f tee "[f=mpegts]udp://127.0.0.1:5678?pkt_size=1316|[f=mpegts]udp://239.0.0.0:1234?pkt_size=1316"; done

⑤ 時間を限って配信するには timeout を使う。
(1時間で配信停止)timeout 1h bash -c '(上と同じ for ... ; done)'

-re: 入力ファイルの読み込みを実際の速度に合わせる。これがないと、ファイルが瞬時に送信される。
-c:a libmp3lame: オーディオコーデックにMP3を使する場合。 -b:a 128k: 音声のビットレート。

音楽ファイルのrotate

毎日録音するので、ファイルは期限を決めて削除する必要がある。3日以上経過したファイルを順に削除するrotateスクリプトを示す。

#!/bin/sh
path="~/sripper"
if [ -d $path ]; then
  d ~
  if [ -d sripper-1 ]; then
    if [ -d sripper-2 ]; then
      rm -rf sripper-2
    fi
    mv sripper-1 sripper-2
  fi
  mv sripper sripper-1
fi

制御は cron で簡単に

以上を組み合わせて、配信PCの cron に以下を記載する。

  • 録音開始直前にファイルのローテート
    □ □ * * * /usr/bin/sh ~/ripper_rotate.sh
  • 夜間録音(mineo夜間フリーなら、23時以降に録音開始)
    □ □ * * * /usr/bin/streamripper 録音対象URL -z -s -d ~/sripper
  • プロセスをkill(mineo夜間フリーなら、朝7時前にKill)
    □ □ * * * /usr/bin/pkill -KILL -f streamripper
  • 昼間配信 = 前々項③④⑤

受信PCでは、
$ mpv -volume=45 udp://239.0.0.0:1234 を実行するだけでよい。
最大音量での再生を避けるため、-volume= オプションを付けたが、mpv の予期しない停止を考慮するなら、次のようなスクリプトを cron で定期的に実行させるのもよいだろう。

#!/bin/bash
Target_URL=udp://239.0.0.0:1234

count=`ps -ef | grep mpv | grep -v grep | wc -l`

if [ $count = 0 ] ; then
# echo "process is dead."
  /usr/bin/mpv -volume=45 $Target_URL &
else
# echo "process is alive."
fi

(注意)実験に際しては著作権を侵害することのないように注意してください。

\ 最新情報をチェック /