インターネット音楽を「mineo夜間フリー」で録音、昼間に「LAN内UDP配信」で複数台のPCで楽しむ方法(Linux)- streamripperとffmpegの活用
ネット配信を録音する(streamripper)
ネット配信の音楽を録音したり、LAN内に再配信するには streamripper が便利だ。録音対象の URL を $TargetURL とすると、次のコマンドで /ホームディレクトリ/sripper に音楽ファイルが保存される。
① streamripper $TargetURL -z -s -d ~/sripper
-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
-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
LAN内に配信する(ffmpeg)
streamripper自身にも配信機能はあるが、受信しながらの配信なので、今回の用途(mineo夜間フリーで録音し、昼間にLAN内に配信する)には適さない。今回採用したのは、ffmpeg による UDP配信で、1対1配信,マルチキャストアドレス配信およびローカルホスト配信の別がある。
① 1対1配信
(配信)ffmpeg -re -i 配信.aac -c:a copy -f mpegts udp://
(受信)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 '(
-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