Mike Slinn

Emby vs. Plex

Published 2025-03-24. Last modified 2025-04-05.
Time to read: 4 minutes.

This page is part of the posts collection.

I have been using Plex on one of my home Ubuntu servers for years to serve movies and images. The experience has been OK.

Emby (formerly Media Browser) is a media server designed to organize, play, and stream audio and video to a variety of devices. Emby's source code was mostly open with some closed-source components.

As of version 3.5.3 [September 19, 2018] Emby has been relicensed and is now closed-source, while open source components will be moved to plugins. Due to this, a free open source fork of Emby was created called Jellyfin.

 – Wikipedia

I previously reviewed and rejected Jellyfin.

Advantages Over Plex

  • Emby has a more capable free tier than Plex. Plex charges a monthly fee for simple features, like the ability to restrict access to selected media for certain users.
  • Plex provides only a main content menu, plus another content menu for each server, linked from the main content menu. This becomes awkward to work with when there are many content libraries, and navigation to the end of the chain can take considerable time when using a Roku remote. In contrast, the Emby content menus are much quicker to navigate, and are just as easy to set up as Plex menus.
  • Emby photo libraries can display animated GIFs.
  • The length of time that Emby slideshows display each image can be customized.
  • I was surprised at how much better the quality of the video provided by Emby is compared to that provided by Plex. @chrisrobbins1970 compared Emby to Plex, and I agree with most of his points. Since @chrisrobbins1970 posted his comparison:
  • Emby allows users to define libraries that contain a mixture of photos and videos. In contrast, Plex requires users to define separate libraries for photos and videos. I did not appreciate how important this feature was until I used it.

Deficiencies

  • Playing a video on the web client often results in a black screen, or this message:
    This is a known problem with the web client. The Roku client and the Android client do not suffer from this problem. This problem is not present in the Plex or Jellyfin web clients.
  • The iOS, Android and Windows clients will not play any video or show any photos without an Emby Premiere license. The Roku client and all of the Plex clients do not have this restriction. (The Plex iOS client costs about $5).
  • There is no facility for searching for a plugin by name when viewing Settings / Advanced / Plugins / Catalog.
  • The thumbnail image for a video cannot be selected from the video. This is a very common feature for programs that display videos. Unlike built-in frame (.bif) files, which are low-resolution images that are displayed when scrubbing back and forth through a video, thumbnail images are displayed when viewing lists of videos so the user can select one to play.
  • There is no onscreen volume control for the web client or the Roku client.
  • The up/down keys do not adjust the web client's volume, unlike the Plex web client.
  • The volume keys on Roku remotes do not work with Emby, although they work with Plex and Jellyfin.

Installation

I installed Emby on my Ubuntu 24.04 server, which was already running Plex server. Gojira has 12 TB SSD, 64 GB RAM, on an MSI Z790 motherboard, and has two GPUs: the Intel Raptor Lake GPU integrated with the Intel Core i7-14700K, and a GeForce GTX 760 video card. The TV I usually watch video content runs Roku.

Shell
$ VER=4.8.11.0
$ wget -O emby-server-deb_${VER}_amd64.deb \ https://github.com/MediaBrowser/Emby.Releases/releases/download/$VER/emby-server-deb_${VER}_amd64.deb
$ sudo dpkg -i emby-server-deb_$VER_amd64.deb --2025-03-24 17:56:40-- https://github.com/MediaBrowser/Emby.Releases/releases/download/4.8.11.0/emby-server-deb_4.8.11.0_amd64.deb Resolving github.com (github.com)... 140.82.113.4 Connecting to github.com (github.com)|140.82.113.4|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/25282228/316b78a0-57a6-4077-8041-24ab36d8af11?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250324%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250324T215537Z&X-Amz-Expires=300&X-Amz-Signature=cde72c7cdba61ff051bc0c6a0bc3a4ab4c838dd14bf7b777df594ea2c43a518b&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Demby-server-deb_4.8.11.0_amd64.deb&response-content-type=application%2Foctet-stream [following] --2025-03-24 17:56:40-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/25282228/316b78a0-57a6-4077-8041-24ab36d8af11?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250324%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250324T215537Z&X-Amz-Expires=300&X-Amz-Signature=cde72c7cdba61ff051bc0c6a0bc3a4ab4c838dd14bf7b777df594ea2c43a518b&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Demby-server-deb_4.8.11.0_amd64.deb&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.108.133, ... Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 173043244 (165M) [application/octet-stream] Saving to: ‘emby-server-deb_4.8.11.0_amd64.deb’
emby-server-deb_4.8.11.0_amd64.deb 100%[=====================================================================================>] 165.03M 54.2MB/s in 3.0s
2025-03-24 17:56:43 (54.2 MB/s) - ‘emby-server-deb_4.8.11.0_amd64.deb’ saved [173043244/173043244]

The above installed Emby in /opt/emby-server/. CSS files live in subdirectories within system/dashboard-ui/.

Firewall and Ports

Like Jellyfin, Emby can be accessed via port 8096.

If your server has a firewall, you need to open the appropriate ports. Ubuntu 8.04 introduced the ufw firewall, and today it is the default firewall for Ubuntu.

The default ports used by Emby are:

  • 8096/tcp is the default for HTTP traffic. You can change this in the dashboard.
  • 8920/tcp is the default for HTTPS traffic. You can change this in the dashboard.
  • 8920/udp is used for secure (https) service auto-discovery. This is not configurable.
  • 7359/udp is used for server discovery by client apps. This is not configurable.

I had already been using ufw before installing Emby. At that time, the ufw status was:

Shell
$ sudo ufw status
Status: active
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere 9000 ALLOW Anywhere 9443 ALLOW Anywhere 32400 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6) 9000 (v6) ALLOW Anywhere (v6) 9443 (v6) ALLOW Anywhere (v6) 32400 (v6) ALLOW Anywhere (v6)

To open the default ports that Emby needed on my server, I typed:

Shell
$ sudo ufw allow 8096,8920/tcp
Rule added
Rule added (v6) 
$ sudo ufw allow 7359/udp Rule added Rule added (v6)

Now the status was:

Shell
$ sudo ufw status
Status: active
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere 9000 ALLOW Anywhere 9443 ALLOW Anywhere 32400 ALLOW Anywhere 8096/tcp ALLOW Anywhere 8920/tcp ALLOW Anywhere 7359/udp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6) 9000 (v6) ALLOW Anywhere (v6) 9443 (v6) ALLOW Anywhere (v6) 32400 (v6) ALLOW Anywhere (v6) 8096/tcp (v6) ALLOW Anywhere (v6) 7359/udp (v6) ALLOW Anywhere (v6)

Like any service, you can start it, stop it, and restart it. To stop it, type:

Shell
$ sudo service emby stop

Automatically Resizing Slideshow Images

Plex automatically sizes images so they fill the screen. Emby does not do this by default. Unlike Plex, Emby can use custom CSS. To make slideshows fill the screen without distorting the aspect ratio, modify the CSS. This is easy to do for people who have any familiarity with CSS.

Slideshow CSS files live within modules/slideshow/style.css. The full path for Slideshow CSS is /opt/emby-server/system/dashboard-ui/modules/slideshow/style.css This is a compressed file. I used js-beautify to uncompress (format) the CSS so I could work on it more easily.

Shell
$ npm -g install js-beautify
added 53 packages in 1s 

This is the js-beautify help message:

Shell
$ js-beautify -h
js-beautify@1.15.4
CLI Options: -f, --file Input file(s) (Pass '-' for stdin) -r, --replace Write output in-place, replacing input -o, --outfile Write output to file (default stdout) --config Path to config file --type [js|css|html] ["js"] -q, --quiet Suppress logging to stdout -h, --help Show this help -v, --version Show the version
Beautifier Options: -s, --indent-size Indentation size [4] -c, --indent-char Indentation character [" "] -t, --indent-with-tabs Indent with tabs, overrides -s and -c -e, --eol Character(s) to use as line terminators. [first newline in file, otherwise "\n] -n, --end-with-newline End output with newline --indent-empty-lines Keep indentation on empty lines --templating List of templating languages (auto,none,angular,django,erb,handlebars,php,smarty) ["auto", auto = none in JavaScript, auto = all except angular in html (and inline javascript/css)] --editorconfig Use EditorConfig to set up the options -l, --indent-level Initial indentation level [0] -p, --preserve-newlines Preserve line-breaks (--no-preserve-newlines disables) -m, --max-preserve-newlines Number of line-breaks to be preserved in one chunk [10] -P, --space-in-paren Add padding spaces within paren, ie. f( a, b ) -E, --space-in-empty-paren Add a single space inside empty paren, ie. f( ) -j, --jslint-happy Enable jslint-stricter mode -a, --space-after-anon-function Add a space before an anonymous function's parens, ie. function () --space_after_named_function Add a space before a named function's parens, ie. function example () -b, --brace-style [collapse|expand|end-expand|none][,preserve-inline] [collapse,preserve-inline] -u, --unindent-chained-methods Don't indent chained method calls -B, --break-chained-methods Break chained method calls across subsequent lines -k, --keep-array-indentation Preserve array indentation -x, --unescape-strings Decode printable characters encoded in xNN notation -w, --wrap-line-length Wrap lines that exceed N characters [0] -X, --e4x Pass E4X xml literals through untouched --good-stuff Warm the cockles of Crockford's heart -C, --comma-first Put commas at the beginning of new line instead of end -O, --operator-position Set operator position (before-newline|after-newline|preserve-newline) [before-newline]

The following renames style.css to style.css-, formats the CSS in style.css-, and saves the formatted version as style.css.

$ cd /opt/emby-server/system/dashboard-ui/modules/slideshow
$ sudo mv style.css{,-}
$ sudo js-beautify \ -LN \ -s 2 \ -f style.css- \ -o style.css

The following highlights the modification to style.css, whereby the value of height on line 36 is changed to inherit:

/opt/emby-server/system/dashboard-ui/modules/slideshow/style.css
 34: .slideshowCardImage {
 35:   width: auto !important;
 36:   height: inherit !important;
 37: }

Emby will serve the modified CSS the next time a slideshow starts.

References

* indicates a required field.

Please select the following to receive Mike Slinn’s newsletter:

You can unsubscribe at any time by clicking the link in the footer of emails.

Mike Slinn uses Mailchimp as his marketing platform. By clicking below to subscribe, you acknowledge that your information will be transferred to Mailchimp for processing. Learn more about Mailchimp’s privacy practices.