이 글은 우분투/데비안 용이다.
우분투 계열이 아니더라도 비슷하겠지만, 아무튼 우분투에서만 해봤기에, 이 부분을 명시했다.
설치
설치는 간단한데, 이게 좀 애매한 면이 있다.
mpd 를 서버로만 쓰려면 X 관련 파일은 필요가 없는데, 우분투 18.04 이후 판들에선(Debian 도, 적어도 Buster 이후로는) X 에 일부 의존을 하고 있다. 물론, X server 가 설치되어 있지 않다하더라도, mpd 설치만으로 X server 자체가 설치되진 않는다.
$ sudo apt install mpd
mpd 는 알고보면 굉장히 간단한데, 모르고 보면 정말 난감하다.
‘간단함’을 위해서 필수로 알아야할 사항은, ‘권한’이다.
디렉토리 권한 설정
일단, 우분투에 기본 설치를 하게 되면 관련 파일은 /var/lib/mpd
이하에 생성된다.
ll /var/lib/mpd/ total 2932 drwxr-xr-x 1 mpd audio 118 2019-07-29 23:29 ./ drwxr-xr-x 1 root root 1012 2019-07-29 21:34 ../ drwx------ 1 mpd audio 10 2019-07-29 22:05 .config/ drwxr-xr-x 1 mpd audio 20 2019-07-29 22:46 music/ drwxr-xr-x 1 mpd audio 864 2019-07-29 22:10 playlists/ -rw-r--r-- 1 mpd audio 2918 2019-07-29 23:29 state -rw-r--r-- 1 mpd audio 12288 2019-07-29 21:34 sticker.sql -rw-r--r-- 1 mpd audio 1490566 2019-07-29 23:01 tag_cache
.config 디렉토리는, Pulse 가 설치되어 있느냐 아니냐에 따라 다른 듯 하다. Pulse 가 있다면 .config 가 생성이 되고, 아니면 안되는 듯?
만약, Pulse 를 쓰지 않을 생각이면, Pulse 를 실행되지 않게할 필요가 있다. 이 내용은 아래에 따로 정리했다.
또, music 디렉토리는 기본 설정으로는 root 의 소유가 된다. root 라도 Everybody 에도 읽기 권한이 있으므로 별 상관은 없으나, 혹여라도 문제가 생길 수가 있으니 소유권을 mpd 로 바꿔준다. 아울러, 그룹도 audio 로 해준다.
$ sudo chown mpd:audio /var/lib/mpd/music
그리고 music 디렉토리에 음원 파일을 넣어놓으면 되는데..
굳이 이렇게할 필요없이, 그냥 music 하위에 심볼릭 링크를 만들면 된다.
만약, /mnt/Music 에 음원이 저장되어 있다면..
$ sudo -u mpd ln -s /mnt/Music /var/lib/mpd/music/Music
음원 디렉토리가 여러 군데라면, 모두 심볼릭 링크를 걸어주면 된다.
단, 이 음원파일들의 허가권에는 반드시 Other:Read(즉, 적어도 755) 가 추가되어 있어야 한다. 또는, mpd:audio 가 그 파일을 읽을 권한이 있어야 한다.
Mpd 설정에서 가장 문제가 되는 부분이 여기다. 사용자 mpd(또는 audio 그룹) 가 그 파일을 읽을 권한이 있어야 mpd 가 정상작동을 한다.
Pulse 사용 안하도록 설정.
Alsa 만 쓰려고 하는데, 괜히 Pulse 가 뜨면 이상한 오류가 발생하면서 문제를 일으키기도 한다.
또, (적어도 지금까지 내가 알아낸 바로는) Pulse 가 떠 있으면 서버가 재부팅되었을 때 mpd 가 이전에 재생하던 곡을 이어서 자동 재생해주는 기능이 작동하지 않는다.
이 기능은 mpd.conf 에서 restore_paused “no”(기본값) 을 해주면 되는데, Pulse 와 문제가 생기면 자동 작동에 문제가 생긴다.
단, 이렇다해도, 이전에 스트리밍 서비스(인터넷 라디오)를 사용하고 있었다면, 이건 자동재생되지 않는 듯 하다.
Pulse 를 중지하기 위해선 pulse 를 자동실행되지 않게 해야 한다.
먼저 /etc/pulse/client.conf 를 /var/lib/mpd/.config/pulse/client.conf 로 복사한다.
sudo -u mpd cp /etc/pulse/client.conf /var/lib/mpd/.config/pulse/ sudo vim /var/lib/mpd/.config/pulse/client.conf
이 파일을 열고, “autospawn = no” 그리고 “daemon-binary = /bin/true” 로 설정한다. 이러면 mpd 사용자와 관련해선 Pulse 가 뜨지 않는다.
만약 시스템 전역에서 Pulse 를 자동으로 사용하지 않게 하려면 /etc/pulse/client.conf 를 수정하면 된다. (autospawn = no)
그리고, 특정 사용자 환경에서만 Pulse 를 사용하려면, ~/.config/pulse/client.conf 를 만들고(복사), autospawn = yes 로 해주면 된다.
autospawn = no 인 환경에서, pulseaudio 를 사용하고 싶다면, 터미널에서 pulseaudio --start
를 실행한다.
이 내용은 이런 저런 인터넷 뒤짐과, 파랑새를 또 다시 일깨워준 Arch Linux 문서, 그리고 내 상상력을 동원하여 알아낼 수 있었다.
참고로, 만약 Pulse 와 문제가 있게 되면, 이런 식의 오류가 발생한다. (오류가 발생해도 mpd 실행엔 별 문제가 없는 듯?)
# systemctl status mpd ● mpd.service - Music Player Daemon Loaded: loaded (/lib/systemd/system/mpd.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2019-08-07 22:35:31 KST; 2min 51s ago Docs: man:mpd(1) man:mpd.conf(5) file:///usr/share/doc/mpd/user-manual.html Main PID: 2296 (mpd) Tasks: 5 (limit: 4454) CGroup: /system.slice/mpd.service └─2296 /usr/bin/mpd --no-daemon Aug 07 22:35:30 musicserv systemd[1]: Starting Music Player Daemon... Aug 07 22:35:31 musicserv systemd[1]: Started Music Player Daemon. Aug 07 22:35:47 musicserv pulseaudio[2334]: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 Aug 07 22:35:47 musicserv pulseaudio[2334]: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 Aug 07 22:35:47 musicserv systemd[1]: mpd.service: Got notification message from PID 2334, but reception only permitted for main PID 2296 Aug 07 22:35:47 musicserv pulseaudio[2334]: [pulseaudio] bluez5-util.c: GetManagedObjects() failed: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 2 matched rules; type="method_call", sender=":1.40" (uid=121 pid=2334 comm="/usr/bin/pulseaudio --start --log-target=syslog " label="unconfined") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination="org.bluez" (uid=0 pid=1016 comm="/usr/lib/bluetooth/bluetoothd " label="unconfined") Aug 07 22:36:07 musicserv systemd[1]: mpd.service: Got notification message from PID 2334, but reception only permitted for main PID 2296
저 오류를 고칠 방법도 있긴 하겠으나, 짧은 지식과 검색 시간으로는 찾아내지 못했다. 그냥 Pulse 를 무시하는 편이 정신건강에 이롭다고 생각된다.
Alsa 관련 권한 문제.
아래 설정을 하다보면 aplay, alsamixer 등을 실행해야 하는데, 오류가 나는 경우가 있다.
이를 해결하는 방법은 다른 글에서.
mpd.conf(/etc/mpd.conf) 설정
mpd.conf 에선 반드시 건드려야할 부분이 딱 한군데가 있다. 나머지는 그냥 기본값으로 놔둬도 작동에 별 무리가 없다.
추가로, mpd.socket 관련된 항목도 설정을 해줄 필요도 있다.
아무튼 반드시 건드려야 하는 한군데가 바로, 사운드 카드 부분이다.
음악 시스템으로는 Alsa 를 사용하기로 하고(Pulse 는 어찌 쓰는지 안해봐서..), 사운드카드로는 SPDIF/외부 DAC 등을 이용하기로 한다.
현재 작동되고 있는 사운드 기기는 다음으로 알아낼 수 있다.
# cat /proc/asound/cards 0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xa1310000 irq 142 1 [Device ]: USB-Audio - USB PnP Sound Device C-Media Electronics Inc. USB PnP Sound Device at usb-0000:00:15.0-3, full speed
1 번, USB Audio 를 사용하기로 한다면, 설정에서 “hw:1,0” 와 같이 지정한다. 이렇게해서 소리가 출력되면 다행인데, 좀 더 다른 기기명을 줘야할 경우도 있다. 그런데, 이 명령(cat /proc/asound/cards
)으로는 모든 사운드 기기가 표시되지 않는 경우가 있다.
이럴 땐 aplay
가 필요하다. 꾸러미 alsa-utils
를 설치하면 이 프로그램을 사용할 수 있다. (이 명령이 제대로 실행이 안되면, 이전 단락에 연결된 문서를 참고한다.)
# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0 .... 생략 # aplay -L ..... default:CARD=PCH HDA Intel PCH, ALC892 Analog Default Audio Device sysdefault:CARD=PCH HDA Intel PCH, ALC892 Analog Default Audio Device front:CARD=PCH,DEV=0 HDA Intel PCH, ALC892 Analog Front speakers ...... iec958:CARD=PCH,DEV=0 HDA Intel PCH, ALC892 Digital IEC958 (S/PDIF) Digital Audio Output .... 생략
aplay –list-pcms(=-L), aplay –list-devices(=-l), 둘 중 아무거나 써도 잘 작동하는 듯 하다.
/proc/asound/cards 이나, aplay 어느 것을 써도 되지만, aplay 쪽이 더 정확한 듯 하니, aplay 결과로 설정하는 편이 좋겠다.
- aplay -l : card 0: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]
- aplay -L : iec958:CARD=PCH,DEV=0
-l 값으로 하면, 카드 0 에 device 1 이므로, device 값은 hw0:1 이 되고, -L 값은, 그대로 그냥 넣어주면 된다.
기본값이나, 불필요한 부분은 모두 지우고, mpd.conf 에서 사용할 부분만 추려보면 다음과 같다.
music_directory "/var/lib/mpd/music" playlist_directory "/var/lib/mpd/playlists" db_file "/var/lib/mpd/tag_cache" log_file "/var/log/mpd/mpd.log" pid_file "/run/mpd/pid" state_file "/var/lib/mpd/state" sticker_file "/var/lib/mpd/sticker.sql" user "mpd" group "audio" # IP 주소로 사용하려면, localhost 또는 0.0.0.0 을 입력한다. #bind_to_address "localhost" # mpd.socket 을 사용할 생각이라면, 아래에서 추가로 명령을 실행해야만 한다. bind_to_address "/run/mpd/socket" #port "6600" #auto_update "yes" # Input ####################################################################### # input { plugin "curl" # proxy "proxy.isp.com:8080" # proxy_user "user" # proxy_password "password" } # QOBUZ input plugin --> 사용불가능하게 enabled = no 로 설정 input { enabled "no" plugin "qobuz" } # TIDAL input plugin --> 사용불가능하게 enabled = no 로 설정 input { enabled "no" plugin "tidal" } # Decoder ##################################################################### # decoder { plugin "hybrid_dsd" enabled "no" } # 이 항목이 없다면 추가해준다. decoder { plugin "wildmidi" enabled "no" } # # ############################################################################### # Audio Output ################################################################ # audio_output { type "alsa" name "USB SPDIF" device "iec958:CARD=Device,DEV=0" # optional # device "hw:0,1" # optional # mixer_type "hardware" # optional # mixer_device "default" # optional # mixer_control "PCM" # optional # mixer_index "0" # optional } ############################################################################### filesystem_charset "UTF-8" #password "password@read,add,control,admin" # http 스트리밍 서버 설정 (아래에서 추가 설명) audio_output { type "httpd" name "OneStep http Stream" encoder "lame" # optional, vorbis or lame # encoder "vorbis" # optional, vorbis or lame port "8000" bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 quality "5.0" # do not define if bitrate is defined # bitrate "128" # do not define if quality is defined format "44100:16:1" # max_clients "0" # optional 0=no limit }
QOBUZ, TIDAL plugin 과 hybrid_dsd, wildmidi Decoder
Ubuntu 20.04 에서 제공하는 mpd 부터는 QOBUZ, TIDAL plugin 과 hybrid_dsd, wildmidi Decoder 를 지원하는가 보다. 기본 제공되는 mpd.conf 에도 이 내용이 들어있다.(wildmidi 에 관한 사항은 mpd.conf 에는 빠져있다. 따라서 위 내용처럼 추가해줄 필요가 있다.)
최근 설치되는(우분투 20.04 기준) mpd.conf
기본값은 위 설정처럼 모두 disable(enabled = no)로 되어 있는데, 예전 mpd.conf 를 그대로 가져다가 쓰면 다음과 같은 오류 메시지를 만나게 된다.
$ sudo systemctl status mpd.service ● mpd.service - Music Player Daemon Loaded: loaded (/lib/systemd/system/mpd.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-08-31 23:53:43 KST; 18min ago TriggeredBy: ● mpd.socket Docs: man:mpd(1) man:mpd.conf(5) file:///usr/share/doc/mpd/html/user.html Main PID: 929 (mpd) Tasks: 7 (limit: 8727) Memory: 6.5G CGroup: /system.slice/mpd.service └─929 /usr/bin/mpd --no-daemon Aug 31 23:53:39 mpd-server systemd[1]: Starting Music Player Daemon... Aug 31 23:53:40 mpd-server mpd[929]: Aug 31 23:53 : exception: Decoder plugin 'wildmidi' is unavailable: configuration file does not exist: /etc/timidity/timidity.cfg Aug 31 23:53:40 mpd-server mpd[929]: Aug 31 23:53 : exception: Input plugin 'tidal' is unavailable: No Tidal application token configured Aug 31 23:53:40 mpd-server mpd[929]: Aug 31 23:53 : exception: Input plugin 'qobuz' is unavailable: No Qobuz app_id configured Aug 31 23:53:43 mpd-server systemd[1]: Started Music Player Daemon.
불평을 한다고 해도 mpd 실행에 지장이 있지는 않지만, 아무튼 이들을 안쓴다고 위 내용처럼 설정에 명시(enabled ‘no’)해주면, 투덜거림을 신경쓰지 않아도 된다.
mpd.socket, 그리고 Port 6600 문제
이건 systemctl status 에는 나오지 않고, journalctl 에만 나오는 문제이긴 하다. 그리고, 오류가 나와도 작동은 되는 경우도 있다.
Sep 01 23:57:48 mpd-server systemd[1079]: mpd.socket: Failed to create listening socket ([::]:6600): Address already in use Sep 01 23:57:48 mpd-server systemd[1079]: mpd.socket: Failed to listen on sockets: Address already in use Sep 01 23:57:48 mpd-server systemd[1079]: mpd.socket: Failed with result 'resources'. Sep 01 23:57:48 mpd-server systemd[1079]: Failed to listen on mpd.socket.
이에 관한 얘기가 개발자 Github 에서 오고갔는데.. 결론은, ‘그냥 놔둬도 된다.’ 이지만, mpd Client 가 서버를 잘 찾지 못할 경우도 있었다.
따라서, 아래와 같이 systemctl 을 사용하여 수정할 필요가 있다.
mpd.socket 을 사용하려 하고, 포트를 바꾸고 싶다면, /etc/mpd.conf 에서 port 를 바꾸는게 아니고, /usr/lib/systemd/system/mpd.socket 에 있는 Port 를 바꿔줘야 한다.
그런데, /usr/lib/systemd/system 은, 시스템 설치관리자(Deb)가 사용하는 위치라고 한다. 따라서 별로 그럴 가능성은 없지만, 꾸러미 판올림이 이행되었을 때, /usr/lib/systemd/system/mpd.socket 파일이 새 파일로 덮어써질 가능성이 있다.
이럴 경우를 대비해서 /etc/systemd/system 으로 Unit 파일을 옮긴 뒤 Reenable 해주는 방식이 훨씬 좋은 우회책이다. (Thank you Arch!)
두가지 방법이 있다는데, systemctl edit 을 사용하는게 좋아 보인다.
sudo systemctl edit --full mpd.socket 그리고 내용 수정.. (포트를 다른 포트로 바꾼다든가)
이러면, /etc/systemd/system/mpd.socket 이 생기고, 자동으로 enable 된다.
위 작업을 해 준 뒤에는, mpd.service
, mpd.socker
을 순차로 멈췄다가 재시작 해줄 필요가 있다. (아니면 그냥 재부팅)
restart 로 해결이 안되면(즉, 클라이언트가 접속을 못한다면), stop 했다가 start 로 재시작 해본다.
또한, bind_to_address “/run/mpd/socket” 를 하면, localhost 부분은 설정하지 않아도 된다. 이 Socket 에 대해선 내가 아직 아는 바가 거의 없어, 관련 내용을 읽어도 무슨 말인지 잘 모르겠다. 소켓에 관한 부분은 MariaDB 때도 나왔었는데..
sudo systemctl restart mpd.socket mpd.service #또는 sudo systemctl stop mpd.socket mpd.service sudo systemctl start mpd.socket mpd.service
그 외에는, audio_output 설정에서 device 만 제대로 설정해주면 더 이상 크게 손 볼 일은 없다.
** Device 설정은 제대로 됐는데, 소리가 안난다면?
왜 그런지 모르지만, 이럴 때가 있다.
alsamixer 를 실행하고, SPDIF 라든가, 선택한 출력 포트가 Mute 되어 있는지 살핀다.
Input?
Input 항목이 없으면 외부에서 접속을 할 수가 없다. Audio Input 관련한 내용이 아니다.
라이브러리 위치?
/var/lib/mpd/music 밑에 심볼릭 링크를 만드는 방식이 좋은게, mpd 는 실제 파일의 절대경로를 기억하는게 아니라 music 이하의 경로를 기억하기에, 나중에 손쉽게 DB 를 복원할 수 있다.
이게 뭔 말이냐하면..
실제 파일 경로가 바뀌더라도 단지 그 파일들을 music 아래 동일하게 심볼릭 링크 시켜주면 mpd 는 변경된 부분을 눈치채지 못한다.
예를 들어, mpd 가 있는 시스템에 로컬로 저장되어 있던 음원을, 외부 서버로 옮겼다고 치자.
원래 파일은 /mnt/Music 이었는데, 파일들은 다른 서버로 옮겨졌고, 그 서버를 nfs 등으로 마운트하여, 이제는 /nfs/Music 으로 경로가 바뀐 상황이다.
현재는 /var/lib/mpd/music/Music -> /mnt/Music 이므로, 지금 mpd 를 실행하면 있던 파일들을 찾지 못한다.
그러나, /var/lib/mpd/music/Music -> /nfs/Music 로만 바꿔주면, 이전과 동일한 환경으로 mpd 를 사용할 수 있다.
심지어 mpd 가 실행 중인 서버를 바꿔도 라이브러리를 쉽게 보전할 수 있다. 즉, 음원 DB 파일인 tag_cache 까지 새로운 서버로 복사해주면, ‘DB 다시 읽기’를 하지 않아도 그냥 바로 쓸 수가 있다. (DB 다시 읽는데 시간이 그래도 꽤 걸리므로, 이 방식은 꽤 유용하다고 할 수 있다.)
PASSWORD 설정
내부 네트웍으로만 쓴다면 이건 별 필요는 없다. 어차피 나만 쓸텐데, 굳이?
그러나 혹여라도 외부에서도 접근하게 한다면, PASSWORD 를 설정해두는 편이 좋겠다.
형식은 password@read,add,control,admin 인데, 패스워드를 가지고 어떤 권한을 줄 지를 설정해줄 수 있게 되어있다.
즉, password1@read, password2@read,add 등을 복수로 설정해놓고, 어떤 패스워드로 접속하느냐에 따라 권한이 달라지게 되는 듯 하다. 사용해보진 않아서 자세하게는 모른다.
설정 끝!
이제, 다른 PC 에서 Cantata 등으로, Android 에선 MPDroid 등으로 이 서버에 접속하면, Mpd 를 편하게 쓸 수 있다.
** Cubietruck 문제
내 큐비트럭의 문제인지, 최신 Armbian 과 뭔가 문제가 있는지, 큐비트럭 자체 Optical Output 을 사용하면 음악이 자주 끊기는 현상이 일어난다. 또는 USB 포트로 연결하여 Optical 포트를 사용해도, 비슷한 현상이 있다.
Buffer 부터해서 별별 설정을 다 건드려봤지만, 증상은 동일했다. 결국 하드웨어 문제라고 밖엔 달리 생각할 길이 없다.
몇 년간 잘 사용해왔는데.. LattePanda 의 노동력을 조금 분산할까 했더니, 그게 조금 아쉽다면 아쉽다고나 할까?
이거, 전원 문제였다. 즉, 전류가 부족해서 이런 현상이 났던 듯 하다. 어댑터를 바꾸고 나서 이 현상은 사라졌다. (이걸 알기까지 몇년이 걸렸다. 물론, 그 동안 잘 안쓰기도 했지만)
Cantata DB 새로 읽기
mpd 에 처음 연결한 뒤, Cantata 에서 ‘데이터베이스 새로 읽기’를 실행해줘야 음원 파일들이 등록된다. 이 파일들은 DB 에 들어가는 게 아니고, 그냥 단순한 텍스트파일로 추출되는데, /var/lib/mpd/tag_cache 가 바로 DB 이다.
그런데.. 보통 이런 작업을 하면 이 파일에 내용을 계속 써가게되는데, 따라서 사용자가 계속 그 디렉토리에서 ls 를 하면 파일이 점점 커짐을 확인할 수 있는데..
mpd 는 음원 파일을 모두 읽고 나서야 파일에 내용을 쓴다. 따라서 진행 중인지 아닌지 알기가 좀 애매하다.
확인하려면, Cantata 에서 ‘폴더’로 가서, 오른쪽 위에 동그라미가 돌고 있는지 보는 방법 밖에 없다. DB 작업 중일 때는 동그라미가 보인다.
Cantata 음원 커버 설정
이 기능은, 음원 디렉토리에 cover.jpg 파일을 넣어놓고, 그 파일을 현재 음원 커버로 사용하기 위한 방법이다.
대부분은, 커버를 인터넷 DB 를 이용하여 자동으로 불러오는데(이게 확실치는 않다.), DB 에 없는 음원들의 경우는 이 방식이 꽤 유용하다.
예전에는 MPDroid 에서 사용하는 방법만 지원해서, 반드시 mpd 가 위치한 서버에 Web 서버를 설치했어야만 했는데, 지금은 훨씬 더 간편해졌다.
게다가, 웹서버 방식은 cover.jpg 등 외부 독립되어 있는 파일만 인식했는데, 이 방식은 음원 파일에 포함되어 있는 커버도 읽어오니 더욱 좋다.
Cantata – 설정 – 음악 폴더 로 이동하여, 디렉토리를 입력한다. 이 디렉토리는, 음원파일이 있는 디렉토리다.
그런데.. mpd 서버가 있는 곳, 음원이 있는 곳, Cantata 가 실행하는 곳, 모두 다를 경우도 있다. 이럴 땐 뭘 어떻게 해야 하나?
다음과 같이 나눠 생각해본다.
- mpd 서버(A)의 음원 파일 위치 : /var/lib/mpd/music ➙ /nfs/Music
- 음원 파일이 있는 서버(B)의 파일 위치 : /mnt/Music
- Cantata 가 실행된 PC(C) 의 음원 위치 ????
mpd 서버 A 는, 서버 B 의 /mnt/Music 을 /nfs/Music 에 마운트했고, 이 디렉토리는 다시 심볼릭 링크로 연결되어 /var/lib/mpd/music 으로 연결되어 있다.
여기까지는 위에서 설명했다.
그럼 Cantata 가 있는 PC 에선? 역시 서버 B 의 /mnt/Music 을 마운트해야만 커버 기능을 사용할 수 있다.
즉, 마운트할 권한이 없다면 이 기능은 쓸 수가 없다. 물론, 그렇다고 해도 음악 재생엔 문제가 없고, 인터넷 DB 로 구할 수 있는 커버도 잘 볼 수 있다.
어쨌든, C PC 에선 음원 파일을 /mynfs/Music-files 로 마운트했다고 가정한다.
Mpd 는 DB 를 만들 때 /var/lib/mpd/music 아래 부분만 저장해놓는다.
예를 들어, /var/lib/mpd/music/한국음악/아무개/01 – 즐거운 오후.mp3 라는 파일이 있을 때, 이 경로를 모두 저장하지 않고, 한국음악/아무개/01 – 즐거운 오후.mp3 로만 기억을 한다.
이 파일을 각 PC 입장에서 보자면,
- A(mpd) : /var/lib/mpd/music/한국음악/아무개/01 – 즐거운 오후.mp3
- B(음원 서버) : /mnt/Music/한국음악/아무개/01 – 즐거운 오후.mp3
- C(Cantata) : /mynfs/Music-files/한국음악/아무개/01 – 즐거운 오후.mp3
굵은 부분만 다르고, 나머지는 동일하다.
Cantata 는 한국음악/아무개/01 – 즐거운 오후.mp3 을 찾게 되는데, 그게 각각 A/B/C 에서 저 위치를 가리키게 된다.
다시 돌아와서, Cantata 의 ‘음악 폴더’ 에는 /mynfs/Music-files 를 넣어주면 된다.
이제 사용자 지정 커버를 찾을 수 있게 됐다.
커버는 음원 파일에 포함되어 있는(Embedded) 것도 찾고, 파일이 있는 디렉토리에 따로 존재하는 그림파일도 찾는다.
cover.jpg 를 기본으로 검색하게끔 설정되어 있는데, (또는 cover.* ??) 다른 파일명을 원하거나, 좀 더 정확하게 하기 위해선 칸타타 – 설정 -인터페이스 – 음반표지 에서 파일명을 지정해준다.
** /var/lib/mpd/music 에 심볼릭 링크를 만들 때 주의 사항.
만약, mpd 서버 A 에서 이렇게 심볼릭 링크를 만들었다고 하면..
/var/lib/mpd/music/한국노래 ➙ /mnt/Music/한국음악
반면, Cantata PC C 에선..
$ ls /mynfs/Music-files drwxrwsr-x 1 user1 group1 18 2019-07-29 22:45 한국음악
이렇게 되어, Cantata 에서 ‘한국노래/fileA.mp3’ 를 찾는 경로는 /mynfs/Music-files/한국노래/fileA.mp3 가 된다. 그러나, 실제 경로는 /mynfs/Music-files/한국음악/fileA.mp3 이므로, 검색에 실패하게 된다.
따라서, 심볼릭 링크를 만들 때는 원본과 동일하게 만들어줘야 한다. 또는, /var/lib/mpd/music 디렉토리를 아예 음원이 위치한 최상위 폴더로 링크하는 방법도 있다.
mpd Stream 설정 (mpd server)
Stream 이 가능하게 설정하면, 외부에서도 MpDroid/Cantata 를 통해 Mpd 를 구동할 수 있다.
설정은 역시 mpd.conf 에서 해야 하며, 참고한 글은 다음과 같다.
- MPDriod Wiki : Configure MPD
- How to Stream MPD and Setup Mpdroid
- Webupd8: STREAM MUSIC TO YOUR ANDROID DEVICE USING MPD AND MPDROID
위 글들을 종합한 결과, 다음과 같은 설정에서 성공할 수 있었다.
audio_output { type "httpd" name "Http Stream" encoder "lame" # optional, vorbis or lame port "8000" bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 quality "5.0" # do not define if bitrate is defined format "44100:16:1" max_clients "1" # optional 0=no limit }
몇가지 조합이 가능한데(lame, vorbis 등등), 이 설정에서 무리없이 작동했다.
max_client 를 1 로 한 이유는, 연결 자체는 여러 기기에서 동시에 가능하지만, 모두 동일한 재생목록을 공유하기 때문에 서로 다른 기계에서 모두 같은 음악을 들을 수 밖에 없기 때문이다.
각 기기별로 재생목록을 별개로 할 수 있을까?? 아직은 필요하질 않아서..
설정을 바꾸고 나선, 그냥 간단하게 재부팅하는게 가장 확실한 방법같다. 재부팅하지 않고 그냥 mpd 만 재실행할 때는 뭔가 꼬이는 듯한 현상이 보였다.
어쨌든, 방법은 이렇다.
sudo systemctl restart mpd.service
mpd Stream 설정 (Cantata)
기존 설정은 같고, HTTP 스트림 URL 에 서버 IP 주소를 넣어준다.
앞에 http 도 붙여야 하는 듯 하다. 포트 번호는 반드시 붙여줘야 한다.
HTTP 스트림 URL : http://192.168.1.122:8000
그리고 칸타타를 재실행하면, 메뉴/출력에서 Http Stream 을 고를 수 있고, 또 다른 메뉴에서 ‘HTTP Stream 연주’도 찾을 수 있다. 둘 모두를 선택해주면, 내 PC 에서 음악을 들을 수 있게 된다.
mpd Stream 설정 (MPDroid)
역시, 기타 설정은 동일하다. 연결 설정 – 기본 연결 설정 – 스트리밍 호스트에 서버 IP 주소를 넣어준다.
포트값은 ‘스트리밍 포트’에 넣어줘야 하는데, 기본값일 경우 그냥 놔둬도 된다.
Cantata 와 마찬가지로, 주메뉴 출력에서 Http Stream 을 선택하고, 음악 재생화면 메뉴에서 ‘스트리밍’을 선택해주면 안드로이드 기기에서 음악을 들을 수 있다.
단, 아무래도 스트리밍이니만큼, 곡 전환이 빠르진 않다.
외부에서도 접근하고 싶다면, 공유기의 포트포워딩 기능을 쓰면 된다. 접근 주소로 공인 IP 를 사용해도 되고, IPTIME 공유기를 쓰고 있다면, xxx.iptime.org 를 사용해도 된다.
다 쓰고 하는 말이지만, MPD 스트리밍보다는 차라리 구글 뮤직을 사용하는 편이 더 나아보인다. 효과는 물론이고, 효율면에서도 mpd 보다 더 낫다. 물론, 업로드하는 일이 그야말로 일이긴 하지만.
2020년 8월, 구글 뮤직은 사망을 고했다… 젠장!
1 thought on “꽃삽질 : mpd 설치 & Cantata 설정.”