---
author:
email: mail@petermolnar.net
image: https://petermolnar.net/favicon.jpg
name: Peter Molnar
url: https://petermolnar.net
copies:
- http://web.archive.org/web/20200504160420/https://petermolnar.net/lightweight-headless-media-player-raspberry-pi/
lang: en
published: '2020-04-18T19:45:00+01:00'
summary: After years of experimentation with modern media center software I gave up.
As usual, the simpler, the better, and cleaner, so welcome back MPD and VLC, and
welcome raspotify.
tags:
- server
title: Raspberry Pi 3 as featherweight headless media renderer
---
During the past years I've been trying to find a media center to
accommodate my local data. Despite my efforts of gardening my music
metadata properly, they all fail, mainly because it's far from a usual
set of stuff. I have:
- films with multiple audio- and subtitle tracks in various formats,
ranging from avi through mkv packed ogg vorbis to mere mp4
- foreign films with Hungarian dub
- music folders with hundreds of randomly thrown together tracks with
deliberately deleted album information
- and so on
Despite the complexity, it's organised. If you open the library in a
file manager, the layout is trivial and it's fairly simple to browse or
find whatever you're after.
Most modern media centers which rely heavily on gathering data from the
internet, fail hard: some never even find the movies - Plex[^1], I'm
looking at you, especially since you became quite agressive with their
you really ought to subscribe message. Others, with plugins and manual
help, like Emby[^2], excel at movies, but simply overheat at music
collections by trying to force everything in one folder into one album.
*Sithicus from Sanguis in Nocte is really not part of the 100 Best
Trance Songs compalation.*
Different solutions, like Nextcloud[^3] are already slow and heavy;
adding media to it really doesn't help. Ampache[^4] feels dated, and no
matter how many times I tried, I failed to properly set it up as
DNLA/UPnP system.
Apart from the library issues, the other problem is DLNA/UPnP itself. If
you're not familiar with the idea or the details, the short summary if
the following every setup would have:
- server
- renderer
- controller
The server contains (or connects to) and manages the data and the
library; the renderer shows the content; the controllers tells the
renderer what to play. The problem is that my main renderer, an LG
Netcast TV, is simple. It's so simple that it can about play wav, mp3,
mpeg2, x264, and that's it. Things like flac, vorbis, x265, etc would
all need to be transcoded. Plex doesn't support ogg and flac. Emby does,
but the transcoding doesn't really suit a 10W TDP CPU that's already
serving websites, and an NFS server. Whenever transcoding wasn't needed,
like most of the music, the TV kept asking for permission at
every.single.track. to allow to play if one was using a controller, and
not the built-in media browser.
So I tried another approach: Kodi[^5], OSMC[^6], and LibreELEC[^7] on a
Raspberry Pi. Again, they tried to be way too smart and complicated, and
none of them offered a simple File Browser mode, or something like that.
Also, all of them are oriented to either touchscreens or fancy remote
controls.
Once I arrived at this point two thoughts popped up in my mind.
1. I ~~want~~ have to make this simpler.
2. Hang on, had I not done this once already?
## Local music
When I first decided to run a home music center, I started with MPD[^8].
MPD, while not *that* old, is still 17 years old. And it's rock solid.
What it does: picks music libraries, plays them to various outputs, and
allows to be remote controlled over the network. That's it. No metadata
fetching daemons, no uber fancy web interface. And it can use `nfs`
shares on the fly. And it has a browse files view.
``` {.bash}
apt install mpd
```
`/etc/mpd.conf`
music_directory "nfs://home.server/music/library"
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"
bind_to_address "0.0.0.0"
port "6600"
auto_update "no"
zeroconf_enabled "yes"
zeroconf_name "mpd @ rasbperry"
filesystem_charset "UTF-8"
input {
plugin "curl"
}
audio_output {
type "alsa"
name "ALSA"
}
There are plenty of clients to control it; on Android, I prefer
M.A.L.P.[^9] whereas on desktop, `gmpc`[^10]
![M.A.L.P. on Android, showing access to Files](malp.png)
I have a Topping MX3[^11] connected to the Raspberry. In order to have
that as default output, `/etc/asound.conf` needs to exists with:
defaults.pcm.card 1
defaults.ctl.card 1
## Local video
### omxplayer
omxplayer[^12] is a Raspberry Pi native player, which has a rather
impressive performance, due to the hardware accelation it utilises on
the Pi. While omxplayer itself doesn't have a HTTP interface, it can
easily be started over SSH, plus there's and android app, OMX Remote
(Raspberry Pi)[^13] which does exactly this for you.
It's a lot faster, than VLC, and certainly has less bugs.
### VLC
**UPDATE: I added the section under `omxplayer` - I had a lof of trouble
with VLC after writing this article.**
I'm aware Kodi & Friends have web interfaces, but that doesn't make them
less wannabe smart. Then I remember that I used to have VLC[^14] with
it's HTTP interface on as player.
``` {.bash}
apt install vlc dbus-x11
```
It's a little tricker to launch it on a headless system - meaning no X
server -, but not that bad:
`/lib/systemd/system/cvlc.service`
``` {.systemd}
[Unit]
Description=Headless VLC service
After=network.target sound.target
[Service]
Type=simple
User=mpd
Restart=always
RestartSec=10
EnvironmentFile=-/etc/default/cvlc
Environment="HTTP_PORT=8080"
Environment="HTTP_PASSWORD=12345678"
Environment="ALSA_DEVICE=hw:CARD=ALSA,DEV=0"
ExecStart=/usr/bin/dbus-launch -- /usr/bin/vlc -A alsa --alsa-audio-device ${ALSA_DEVICE} -I http --http-port ${HTTP_PORT} --http-password ${HTTP_PASSWORD} --media-library
[Install]
WantedBy=multi-user.target
```
The `dbus-x11` package contains the `dbus-launch` command, which allows
the service to start in a non-x environment properly. The ALSA device
selected in this case is the built-in HDMI; `aplay -L` gives the list of
options.
Unfortunately, unlike MPD, VLC can't directly use NFS shares, so it
needs to be mounted by hand by adding this to `/etc/fstab`:
``` {.fstab}
home.server:/media/library /media nfs ro,hard,intr,rsize=8192,wsize=8192,timeo=14 0 0
```
Once done, with a remote control, like VlcFreemote[^15] on android, the
whole filesystem can be browsed, including the NFS mount. This way
there's not transcoding problem, no mis-identified media problem, and
all the subtitles/tracks are available.
![VlcFreemote on Android, showing the whole remote
filesystem](vlcfreemote.png)
## Spotify
*Yes, I use Spotify. Yes, I should buy albums. Trouble is: the CD is not
that good business for the artist either, so unless I can buy on
Bandcamp directly from the band, I'm ok with Spotify. I will, and always
had been trying to go live gigs, because that is an actual support, plus
a whole different, hopefully unique experience.*
I mentioned I went down similar roads a while ago but that was before
Spotify Connect appeared. I gave mopidy with it's spotify plugin[^16] a
go, but it wasn't working nicely, so instead, I used to run the full
fledged Spotify client in a mocked X environment with xfvb. Sometimes is
worked. Sometimes.
Eventually I stumbled upon `spotifyd`[^17] and `raspotify`[^18]. Tried
both, with `raspotify` came out as winner - it shows up as speaker over
Wi-Fi properly, allowing other accounts to use it and see it as well. It
has nice install guide, and basicall doesn't need any special trickery
to work.
![Spotify on Android showing raspotify as a local network client for
Raspotify](spotify.png)
## A maybe-working DLNA/UPnP setup
The trial and search journey that dragged me across these experiences
introduced a nice project: gmrender-resurrect[^19]. This is a picked up
and continued project of an old, abandoned software, GMediaRenderer,
which was made to be an audio *(and potentially video, but I still can't
get that running, no matter, what)* DLNA renderer for linux. Combined
with pulseaudio-dlna[^20] it's possible to stream the audio of anything
- in-browser youtube, etc - onto my speakers via the raspberry.
Unfortunately, pulseaudio-dlna itself can get rather choppy and slow; it
works fine on my XFCE desktop, but not with my wife's Cinnamon.
If I ever make it work properly, I'm hoping I can add the codecs into
gmrender itself, making the problem of the lack of codecs disappear, and
use a simple minidlna[^21] to be my media server again. Talking about
minidlna: it has a fork, that, in theory, can transcode if needed:
ReadyMedia-transcode[^22].
![Pulseaudio on XFCE showing network DLNA sound renderers as potential
output devices](pulseaudio-dlna.png)
I'm going to stick to MPD, VLC, raspotify, for now. It's working. Not
the nicest, shiniest setup, but it does what I'm asking for. I have
Netflix and Amazon Prime, where having information, maybe even trailers,
can be important. With my own collection, especially with the music and
the ripped CDs of street musicians, I know what I'm looking at, I don't
need overly smart media centers with their mistakes and CPU baking
capabilities.
[^1]:
[^2]:
[^3]:
[^4]:
[^5]:
[^6]:
[^7]:
[^8]:
[^9]:
[^10]:
[^11]:
[^12]:
[^13]:
[^14]:
[^15]:
[^16]:
[^17]:
[^18]:
[^19]:
[^20]:
[^21]:
[^22]: