29.mpd player作成

ブラウザとmpvコマンドを利用した音楽プレーヤー(sql版vue版)を作ったが、 今度は、mpdデーモンを利用して音楽プレーヤーを作ってみた。

更新: 本playerをベースにmpv playerを作成した時に、cgi pythonの有効化とDLNAへのアクセス方法が分かり、本playerにも機能追加した。(2022/12/28)

    機能:
  1. nas上のファイル再生
  2. youtubeの再生
  3. net radioの再生
  4. dlnaのファイル再生(2022/12/28追加)

●mpd下調べ

mpd用のclientソフトが色々出ているが、それらを使わず独自で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) :

●ブラウザの操作

ブラウザ側はjavascriptでサーバ側とやり取りする。主な画面操作は以下の通り。

§
mpd playerのブラウザ画面
§


01.音楽プレーヤーのインデックス画面

02.mpd-playerのtop画面

03.mpd-playerのnasファイル再生画面

04.mpd-playerのyoutube再生画面

05.mpd-playerのradio再生画面

06.mpd-playerのdlna 再生画面

●所感

VLC、mplayer、mpvそして今回mpdを利用して音楽プレーヤーを作ったが、mpdは専用コマンドでコントーロールがしやすかった。
再生音質はハードが同じなのでどれも似た感じだが、気持ち的にmpdの音質が切れの良いスッキリした音に感じた。
Youtubeについて、ストリーミング再生する方法が分からず、ファイルを事前ダウンロードして再生させる方法を試したが、保管サイズが大きくなるので netで2日間探しまくりやっと見つけた情報(参考:2番参照)でストリーミング再生できてホッとした。
また、mpdのupnp機能を試してみたが、NASディレクトリを併用できず、更に音楽のcover artを取得できなかったので諦めたが、下調べしてから再挑戦の予定。 DLNA(upnp)へのアクセス方法が分かったので機能追加した。(2022/12/28)

【参考】
  1. Music Player Daemon"ローカル設定_(ユーザーごと)"
  2. mpd play youtube stream
  3. mpd command

更新:2022/12/28(2022/10/12)