I am just a Ninja beta tester and another paying user. My statements are not Plex official.
My Technical Perspective Summary
The Plex clients for Apple macOS, iOS, iPadOS and tvOS employ either:
- Apple’s Native Player Engine -
AVPlayer - Open Source Player Engine -
mpv
The former is referenced as the old player. The latter is the new player.
OpenGL has been deprecated by Apple. In order to maximize full hardware acceleration, a player engine needs to support Metal API. mpv does not support Metal API.
On the AppleTV, the old player is not enabled by default–thus the Plex client uses mpv as the engine for playback. It has to use a shim (translation layer) which is part of the reason video is lagging behind the audio. There is no avoiding this penalty. This is happening whether directly connected to a display and using internal speakers or outputting to AVR/soundbar.
For reference, Infuse uses a custom player engine built from the ground up to leverage Metal API.
Long term fix for this can only be resolved in three ways:
- Apple develops AVPlayer to support more container formats, more video codecs and more audio codecs. ‘mpv’ supports much more than AVPlayer does
- ‘mpv’ developers add support for Metal API. Not likely anytime soon as this was a known issue already in late 2017 by then lead ‘mpv’ developer wm4
- Plex builds their own player engine or shifts to something like libVLCcore (devs for Swiftfin to connect to Jellyfin are already leveraging this engine)
There is no easy solution to resolve this as the core issue is with the deficiency of the player engine. If you must use an AppleTV, enabling “Use old player” is the only limited but functional way to use Plex on AppleTV. I personally use the Shield as I spent a lot of personal time with the Plex and Nvidia staff to vet out a ton of deficiencies in resolution switching, refresh rate switching and proper handling of all the mainstream codecs.