ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

超ローテクでRaspberry Pi 3をBGMサーバーに

(2022-01-17 初稿 - 2022-01-21 修正・追記 )

(2022-01-19 追記)

VLC media playerが、バックグランドにもなり、とても使い勝手が良いことがわかった。そこで、この記事もVLCを利用する方法に修正、追記した。

(追記終了)

 

サーバとして使っていたRaspberry Pi 3を、先日苦労してBusterからBullseyeにアップグレードした。実のところ、アップグレードは、この記事のBGMサーバにするための準備だった。

筆者以外にもPi 3を4に更新し、余っているPi 3がある方も多いのではないかと思う。筆者の手元には数台のPi 3があり、その有効活用のひとつとして、Pi 3を超ローテクでBGMサーバにしてしたみた。

前提条件

f:id:hymd3a:20220117161751j:plain

ラズパイにSSHで命令

ラズパイをBGMにするために、この記事では以下の前提がある。前提が多くて申し訳ない。m(__)m

  1. ラスパイとSSH接続できるPCがあり、できればパスフレーズ無しで接続できることが望ましい
  2. ラズパイにはスピーカーをつないでBGMを流す
  3. BGMなので、曲は選ばずにプレイリスト内の曲をランダムに選択して流す

以上の前提があり、それでも使ってみるという方は、以降を読んでください。

ラズパイの設定

プレイヤーソフトの選択

余ったラズパイには、ディスプレイやキーボード、マウスを付けておきたくないので、ラズパイはX環境の無いCLIとし、操作はリモートPCからのSSH接続で行うこととする。

CLIで運用するので、もちろん音楽再生ソフトもCLIで動作させる必要がある。CLIで動作するプレイヤーソフトとして、筆者が試した以下の3つを挙げる。

  • mpg123:軽量、今回の目的には必要十分
  • mpg321:やや重い、romoteコントロールが使えるようになると面白い(調査中)
  • mplayer:重量、今回の目的以外にも、ラジオなどの他のストリーム系も対応可
  • VLC Media Player:cvlcでCLIに対応、かつ、バックグランド実行にも対応

今回の目的のためには、いずれのソフトも必要十分な機能なので、コメントを参考にインストールして欲しい。インストール方法は、以下のとおり。

$ sudo apt install mpg123 ( or mpg321 or mplayer or vlc)

以下では、すべてのソフトの設定を示すのは冗長なので、mpg123の設定を示し、場合によりmplayerの設定を示す。

バックグランドでの実行

筆者の望みとしては、これらのソフトをバックグランドで実行し、必要に応じてフォアグランドで操作することだった。が、残念ながらいずれのソフトも希望に叶わず、バックグランド実行ができなかった。

VLCのみが、バックグランド実行に対応していた。

しかし、この問題は、どのソフトでも後ほどSSH接続で解決できる。

蛇足だが、nohupを用いれば、いずれのソフトもバックグランド実行が可能である。

$ nohup mpg123 xxxx.mp3 &
$ cvlc xxxx.mp3 &

fgコマンドでフォアグランドにできるが、残念ながらVLC(cvlc)以外は、再びバックグランドにすることができない。

さらに余談であるが、どのソフトもラズパイにtmuxやscreenを導入すれば解決する。しかし、今回は簡易なBGMサーバであるため、これらの導入は見送った(単に面倒 (^^ゞ)。

SSH接続での操作

ここでは、ローカルPCからリモートのラズパイにパスフレーズで接続することを想定しているが、まだ設定が済んでいない場合は、以下を参考に設定して欲しい。

ラズパイ本体では思うような動作が難しかったが、筆者がやりたかったSSHを用いてリモートPCでラズパイを操作する方法はnohupを用いなくても動作する。

ssh Server  mpg123 xxxx.mp3 

さらに、以下のようにバックグランドで動作させるとsshのPIDを削除してもBGMを流し続けてくれる。

$ ssh Server  mpg123 xxxx.mp3  & 
$ pgrep mpg123 $ kill 上記で調べたPID

playlistファイルの作成

playlistファイルの作成は、以下のように行う。

$ ls ~/Music/folder/*.mp3 > ~/Music/playlist-sample.m3u

他にもいろいろ情報を書き込めるようだが、今回は省略するので、必要な方はWebで検索して欲しい。

スクリプトの作成

これらを踏まえて、以下のBashスクリプトを作成した。

なお、mplayerを利用することを前提に作成したが、mpg123に変更する場合はコメントを参照して変更願う。

(2022-01-19 追記)

一応、以下のスクリプトも残しておくが、もうひとつ下のVLCを用いたスクリプトの利用をおすすめする。

(追記終了)

$ cat bin/bgm

#/bin/bash
# Written H.Yamada 2022-01-16
# ver0.03 2022-01-16 サーバ設定をコマンドライン引数に
# Raspberry Pi 3をBGMサーバに
# bgm  Music Start/Stop Toggle

# Global Variable
USAGE="bgm BGM On/Off Program for Raspberry Pi
ver0.03 Raspberry PiをBGMサーバに
[Usage] bgm server
        On/Off togle switch program
        server:設定無しの場合は手元のPC
"
CMD="mplayer"                       # CMD="mpg123"
OPTION="-quiet -shuffle -playlist"  # OPTION="-q -Z -@"
M3UFILE="Music/playlist-sample.m3u" if [ $# -gt 2 ]; then   echo "$USAGE"   exit fi SERVER="$1" #echo $SERVER if [ $SERVER ]; then   rt=$(ssh $SERVER pgrep $CMD)   if [ $rt ]; then     echo "BGM off"     ssh $SERVER killall -9 $CMD   else     echo "BGM on"     ssh pi@$SERVER $CMD $OPTION /home/pi/$M3UFILE &     sleep 3     #echo $!  # クライアント側プロセスを消してOK     kill $!   #直前のバックグランドjobのプロセスID   fi else   rt=$(pgrep $CMD)   if [ $rt ]; then     echo "BGM off"     kill $rt   else     echo "BGM on"     nohup $CMD $OPTION ~/$M3UFILE &   fi fi

こちらのスクリプトがおすすめ。

(2022-01-19追記)

#/bin/bash
# bgm  Music Start/Stop Toggle
# Written H.Yamada 2022-01-16
# ver0.05 2022-01-19 vlc(cvlc)に変更 
# Raspberry Pi 3をBGMサーバに
# Global Variable
USAGE="bgm BGM On/Off Program for Raspberry Pi
ver0.05 Raspberry PiをBGMサーバに
[Usage] bgm [-u username] [-f m3u-file] server
        On/Off toggle switch program
        Options
          -u username default pi
          -f m3u-file default m3ufile.m3u
        server:設定無しの場合はローカルPC
"
CMD="vlc"                             # CMD="mpg123" or "mplayer"
OPTION="-I dummy -Z"                  # cvlc nearly = vlc -I dummy
M3UFILE="playlist-sample.m3u"

usage_exit() {
        echo "$USAGE"
        exit 1
}

if [ $# -gt 6 ]; then
  usage_exit
fi

USR="pi"         # Default User
SERVER=""

while getopts :f:hu: OPT
do
  case $OPT in
    f)  M3UFILE=$OPTARG
        ;;
    h)  usage_exit
        ;;
    u)  USR=$OPTARG
        ;;
    \?) usage_exit
        ;;
  esac
done

shift $((OPTIND - 1))

SERVER="$1"

#echo "USER="$USR "SERVER="$SERVER "M3UFILE="$M3UFILE

if [ $SERVER ]; then
  rt=$(ssh $USR@$SERVER pgrep $CMD)
  if [ $rt ]; then
    echo "BGM off"
    ssh $USR@$SERVER killall -9 $CMD
  else
    echo "BGM on"
    ssh $USR@$SERVER PULSE_SERVER=localhost \
      $CMD $OPTION /home/$USR/Music/$M3UFILE \
      > /dev/null 2>&1 &
    sleep 3
    #echo $!  # クライアント側プロセスを消してOK
    kill $!   #直前のバックグランドjobのプロセスID
  fi
else
  rt=$(pgrep $CMD)
  if [ $rt ]; then
    echo "BGM off"
    kill $rt
  else
    echo "BGM on"
    $CMD $OPTION ~/Music/$M3UFILE &
  fi 
fi

(追記終了)

実際の実行は、ローカルPCの場合は、bgm コマンドのみをリモートPCで実行する場合は、オプションで-u ユーザ名 -f m3uファイル名の他、サーバ名を入力する。

$ bgm [-u Username -f M3ufile] (server) # serverをなしの場合ローカルPCで実行

再度同じコマンドを入力することにより、BGMをoffにできる。

音量調節

スクリプトでは、音量調節ができないので(<をい)、ラズパイに付けたスピーカーのボリュームで調節するか、以下のようにSSHでサーバに接続してalsamixerで調節してね。^^;

$ ssh Server
$ alsamixer

おわりに

バックグランド実行で手間取ったが、なんとか思うようにラズパイをBGMサーバとして活用できそうだ。VLCmplayerはサイマルラジオ等のネットストリームの再生もできるようなので、設定ができたらまたアップする。

なお、余談だが、この投稿がはてなブログの100個目の記事になる。

少し振り返ってみると、誤字や間違いが多くあるので、しばらくの間、新規を控えて修正と更新をしたいと考えている。

今後ともご愛顧お願いします。

関連ページ