●mpd下調べ
mpd用のclientソフトが色々出ているが、それらを使わず独自でmpdと通信して再生させる方法を調べた。
- port:6600でソケット通信
- addコマンドで再生ファイル等のアドレスをplaylistに追加してからplayコマンドで再生する
- stopコマンドで停止
- currentsongコマンドで再生中曲情報を得る
- statusコマンドで再生状況を得る
- 当方の場合、/mntのnasフォルダにユーザしかアクセスできないのでmpdをユーザ起動する必要が有る
上記を踏まえて、サーバ(player)側はPHPを使えばできそうだが、cover画像の処理方法が分からなかったので、PHP経由pythonプログラムで処理することにした。
mpv player作成時にCGI pythonを有効化する方法が分かったので、PHP無しで直にpythonプログラムをアクセスするようにした。(2022/12/28)
●mpdをユーザ起動させる設定
当方のnasがsmb1.0でmountコマンドではマウントできずgioコマンドでのマウントを行っているため、
ユーザ(pi)しかアクセスできず、mpdもpiユーザで起動する必要が有るのでsystem起動からユーザ起動への変更設定を行った。(参考:1番参照)
※mpd version 0.22.6
●mpd.confファイルの作成
$ mkdir -p ~/.config/mpd
$ cp /usr/share/doc/mpd/mpdconf.example.gz ~/.config/mpd/
$ cd .config/mpd
$ gunzip mpdconf.example.gz
$ mv mpdconf.example mpd.conf
$ nano ~/.config/mpd/mpd.conf
以下の項目のコメントを外しフォルダ名を書き換える
# Required files
db_file "~/.config/mpd/database"
log_file "~/.config/mpd/log"
# Optional
music_directory "~/Music" or "/mnt"
playlist_directory "~/.config/mpd/playlists"
pid_file "~/.config/mpd/pid"
state_file "~/.config/mpd/state"
sticker_file "~/.config/mpd/sticker.sql"
:
# Audio Output ################################################################
resampler {
plugin "soxr"
quality "high"
threads "1"
}
audio_output {
type "alsa"
name "My ALSA Device"
## device "hw:0,0" # optional
device "iec958:PCM2702,0" # usb aplay -Lで調べる
## mixer_type "hardware" # optional
## mixer_device "default" # optional
## mixer_control "PCM" # optional
## mixer_index "0" # optional
}
:
audio_output {
type "pulse"
name "My Pulse Output"
## server "remote_server" # optional
server "127.0.0.1"
## sink "remote_server_sink" # optional
## media_role "media_role" #optional
}
※alsaとpulseを有効にし、alsaがダメならpulseに切り替えてくれる
$ mkdir ~/.config/mpd/playlists
●system起動のmpd停止
$ sudo systemctl stop mpd
$ sudo systemctl disable mpd
$ sudo reboot
mpdの起動
$ mpd ~/.config/mpd/mpd.conf
稼動確認
$ ps ax|grep m[p]d
mpd停止
$ mpd --kill
●自動起動用desktopファイル作成
$ nano ~/.config/autostart/mpd.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Music Player Daemon
Comment=Server for playing audio files
Exec=mpd
StartupNotify=false
Terminal=false
Hidden=false
X-GNOME-Autostart-enabled=false
●pythonプログラム
サーバ側pythonプログラムはブラウザからmpdのコマンドを受け取って橋渡しするだけ。
コマンドの種類は参考:3番参照のこと。
※リストの一部
import sys
from PIL import Image, ImageFile, UnidentifiedImageError
import io
import mutagen
import json
import socket
import base64
import imghdr
import csv
import subprocess
ImageFile.LOAD_TRUNCATED_IMAGES = True
# mpdとソケット通信
def execCmd(cmd):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
s.connect(("localhost", 6600))
buf = s.recv(512).decode()
content = cmd + '\n'
s.send(content.encode())
ret = s.recv(102400).decode()
return ret
:
:
# youtubeのaddコマンド
prm = "yt-dlp --prefer-insecure -g -x -f bestaudio " + ycode + ' 2>/dev/null'
parameter = subprocess.run(prm, shell=True, capture_output=True, text=True)
ret = execCmd('add ' + parameter.stdout)
:
addコマンドで渡すデータ
- 音楽ファイルは、mpd.confで指定したディレクトリ内のパス
- youtubeは、コードをyt-dlpで変換した値(参考:2番参照)
- radioは、url
●ブラウザの操作
ブラウザ側はjavascriptでサーバ側とやり取りする。主な画面操作は以下の通り。
- mpdのplaylistに登録済みのアルバムを再生
- 下図2内の写真下に有るリストから選んで’選択’ボタン押下
- 下図3で再生したい曲を選んで’開始’ボタン押下
- サーバ側csvファイルに登録したyoutube一覧を読み込んで選曲再生
- 下図2右下に有る'src list'ボタン押下
- 下図4右下の'Youtube'ボタン押下
- 下図4下表より再生したい曲を選んで’音楽一覧に追加’ボタン押下
- 下図4上表より追加された曲を選んで’開始’ボタン押下
- サーバ側のradio listを読み込んで選局再生
- 下図2右下に有る'src list'ボタン押下
- 下図5右下の'Radio'ボタン押下
- 下図5下表より再生したい局を選んで'音楽一覧に追加'ボタン押下
- 下図5上表より追加された局を選んで'開始'ボタン押下
- DLNA内ファイルの再生
- 下図2右下の'src list'ボタン押下
- 下図6右下の'DLNA'ボタン押下
- DLNA Media Serverを選択し'フォルダ開く'ボタン押下
- 聞きたい曲のフォルダまで'フォルダ開く'ボタン押下で掘り下げていく
- 聞きたい曲を選択し'音楽一覧に追加'ボタン押下
- 音楽一覧に表示されたら選択し'開始'ボタン押下
- ボタンの無いmpdコマンドの送信
- 図2下方左の入力欄に送信するコマンドを入力し’コマンド送信’ボタン押下
- コマンドの返り値は入力欄上の'command status'に表示される
●所感
VLC、mplayer、mpvそして今回mpdを利用して音楽プレーヤーを作ったが、mpdは専用コマンドでコントーロールがしやすかった。
再生音質はハードが同じなのでどれも似た感じだが、気持ち的にmpdの音質が切れの良いスッキリした音に感じた。
Youtubeについて、ストリーミング再生する方法が分からず、ファイルを事前ダウンロードして再生させる方法を試したが、保管サイズが大きくなるので
netで2日間探しまくりやっと見つけた情報(参考:2番参照)でストリーミング再生できてホッとした。
また、mpdのupnp機能を試してみたが、NASディレクトリを併用できず、更に音楽のcover artを取得できなかったので諦めたが、下調べしてから再挑戦の予定。
DLNA(upnp)へのアクセス方法が分かったので機能追加した。(2022/12/28)