Plex cannot play Apple Positional Audio Codec (APAC) files

Server Version: 1.43.3.10828
Player Version: 8.45 (Apple TV)
OS: Windows 11 25H2
Plex Pass: Yes


Issue Summary

Playback fails entirely for .mov files containing APAC (Apple Positional Audio Codec) audio — both with Direct Play enabled AND disabled. The error shown on screen is:

Could not direct play because: App cannot direct play this item. No direct play video profile exists for protocol http, with container mov, video codec hevc, and audio codec apac.
Could not transcode because: Cannot convert this item. Implementation for audio decoder ‘apac’ not found.


Background

APAC (Apple Positional Audio Codec) is Apple’s new spatial/immersive audio format introduced with Apple Vision Pro and now used in videos captured by recent iPhones. These are standard .mov files recorded on-device that play perfectly natively on Apple platforms and in third-party apps including VLC, Infuse, and File Explorer XE — all without any issues.

Plex is the only player that cannot handle these files. Since Plex’s bundled FFmpeg does not include an APAC decoder, both direct play and transcoding fail, leaving users with a hard error and no fallback.


Steps to Reproduce

  1. Record a video on a recent iPhone (iOS 17+) — file will be a .mov with APAC audio and HEVC video
  2. Add to Plex library on Windows
  3. Attempt playback on Apple TV Plex app (v8.45)
  4. Error appears regardless of Direct Play on or off
  5. Same file plays without issue in VLC, Infuse, and File Explorer XE

What I Have Already Tried

  • Disabled Direct Play on Apple TV client — same error
  • Disabled hardware-accelerated transcoding on server — same error
  • Confirmed Plex Media Server logs show: Error creating a MFX session: -9 (Intel Quick Sync failing) and Implementation for audio decoder ‘apac’ not found
  • Installed full FFmpeg build separately — Plex uses its own bundled FFmpeg DLLs (avcodec-60.dll etc.) and cannot use an external FFmpeg

Root Cause

Plex’s bundled FFmpeg (avcodec-60.dll) does not include an APAC decoder. Since APAC is an Apple-proprietary codec, it requires either:

  • Native Apple framework calls (available on macOS/iOS), or
  • A licensed/open-source APAC decoder added to Plex’s FFmpeg build

This means Plex cannot decode or transcode these files at all on Windows, regardless of any client or server settings.


Feature Request

As a Plex Pass subscriber, I expect Plex to handle modern media formats gracefully — especially files recorded on mainstream consumer devices like iPhones. VLC, Infuse, and other players already handle APAC seamlessly.

I am requesting that Plex:

  1. Add APAC decoder support to the bundled FFmpeg/transcoder so these files can be transcoded server-side
  2. Fail gracefully — if a codec is unsupported, Plex should display a clear, informative message rather than a generic playback error that gives no actionable guidance to the user
  3. Dynamically handle unsupported formats similar to how VLC and Infuse do — detect the codec, attempt conversion, and communicate the status clearly

Plex positions itself as a unified media platform for all content. With Apple Spatial Video and APAC becoming increasingly common as iPhone adoption grows, this will affect a growing number of Plex Pass users.


Attached: Screenshot of error on Apple TV screen

Happy to provide full server logs if needed — I have already downloaded them and confirmed the exact codec failure. Please let me know what additional information would help the Plex team investigate.

Thank you.

Guys managed to fix the issue using Claude, now all my videos are playing using Plex app on Apple TV 4K(direct play, no old player), Storage - Synology NAS, Plex Server on dedicated - Gibibyte BRIX Mini PC

Steps to Fix

  1. Created this directory - %LOCALAPPDATA%\Plex Media Server\Profiles
  2. Created 2 files - ios and tvOS(attached files)

tvOS.xml

Profiles.zip (1.9 KB)

?xml version="1.0" encoding="utf-8"?>

<Client name="tvOS">
  <!-- Author: Plex Inc. -->
  <!-- This profile is used by A5 and higher devices (starting with iPhone 4S and iPad 3) -->
  <Settings>
    <Setting name="DirectPlayStreamSelection" value="true" />
    <Setting name="StreamUnselectedIncompatibleAudioStreams" value="true" />
  </Settings>
  <TranscodeTargets>
    <VideoProfile container="mp4" codec="h264" audioCodec="aac,ac3,eac3" subtitleCodec="mov_text" context="static" />
    <VideoProfile protocol="hls" container="mp4" codec="h264" audioCodec="aac,ac3,eac3" subtitleCodec="eia_608_embedded" context="streaming" />
    <VideoProfile protocol="hls" container="mp4" codec="hevc" audioCodec="aac,ac3,eac3" subtitleCodec="eia_608_embedded" context="streaming" />
    <MusicProfile container="mp4" codec="aac" />
    <PhotoProfile container="jpeg" />
    <SubtitleProfile protocol="hls" container="webvtt" subtitleCodec="webvtt"/>
  </TranscodeTargets>
  <DirectPlayProfiles>
    <VideoProfile container="mp4" codec="h264" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <VideoProfile container="mp4" codec="hevc" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <VideoProfile container="mov" codec="h264" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <VideoProfile container="mov" codec="hevc" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <!-- Allow Direct Play of HLS content -->
    <VideoProfile protocol="hls" container="mpegts" codec="h264" audioCodec="aac,ac3,eac3,mp3" />
    <VideoProfile protocol="hls" container="mp4" codec="h264" audioCodec="aac,ac3,eac3,mp3" />
    <VideoProfile protocol="hls" container="mp4" codec="hevc" audioCodec="aac,ac3,eac3,mp3" />
    <MusicProfile container="mp3" codec="mp3" />
    <MusicProfile container="mp4" codec="aac" />
    <MusicProfile container="mp4" codec="alac" />
    <MusicProfile container="flac" codec="flac" />
    <PhotoProfile container="jpeg,gif,bmp,png" />
  </DirectPlayProfiles>
  <CodecProfiles>
    <VideoCodec name="h264">
      <Limitations>
        <UpperBound name="video.width" value="3840" isRequired="true" />
        <UpperBound name="video.height" value="2160" isRequired="true" />
        <UpperBound name="video.bitDepth" value="8" />
        <NotMatch name="video.separateFields" value="1" />
      </Limitations>
    </VideoCodec>
    <VideoCodec name="hevc">
      <Limitations>
        <UpperBound name="video.width" value="3840" isRequired="true" />
        <UpperBound name="video.height" value="2160" isRequired="true" />
        <UpperBound name="video.bitDepth" value="10" />
        <NotMatch name="video.separateFields" value="1" />
        <UpperBound name="video.width" value="1920" onlyTranscodes="true" />
        <UpperBound name="video.height" value="1080" onlyTranscodes="true" />
        <UpperBound name="video.bitDepth" value="8" onlyTranscodes="true" />
      </Limitations>
    </VideoCodec>
    <VideoAudioCodec name="*">
      <Limitations>
        <UpperBound name="audio.channels" value="2" onlyTranscodes="true" />
      </Limitations>
    </VideoAudioCodec>
  </CodecProfiles>
</Client>

iOS.xml

<?xml version="1.0" encoding="utf-8"?>

<Client name="iOS">
  <!-- Author: Plex Inc. -->
  <!-- This profile is used by A5 and higher devices (starting with iPhone 4S and iPad 3) -->
  <Settings>
    <Setting name="DirectPlayStreamSelection" value="true" />
    <Setting name="StreamUnselectedIncompatibleAudioStreams" value="true" />
  </Settings>
  <TranscodeTargets>
    <VideoProfile container="mp4" codec="h264" audioCodec="aac,ac3,eac3" subtitleCodec="mov_text" context="static" />
    <VideoProfile protocol="hls" container="mp4" codec="h264" audioCodec="aac,ac3,eac3" subtitleCodec="eia_608_embedded" context="streaming" />
    <VideoProfile protocol="hls" container="mp4" codec="hevc" audioCodec="aac,ac3,eac3" subtitleCodec="eia_608_embedded" context="streaming" />
    <MusicProfile container="mp4" codec="aac" />
    <PhotoProfile container="jpeg" />
    <SubtitleProfile protocol="hls" container="webvtt" subtitleCodec="webvtt"/>
  </TranscodeTargets>
  <DirectPlayProfiles>
    <VideoProfile container="mp4" codec="h264" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <VideoProfile container="mp4" codec="hevc" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <VideoProfile container="mov" codec="h264" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <VideoProfile container="mov" codec="hevc" audioCodec="aac,ac3,eac3,mp3,apac" subtitleCodec="mov_text,tx3g,ttxt,text" />
    <!-- Allow Direct Play of HLS content -->
    <VideoProfile protocol="hls" container="mpegts" codec="h264" audioCodec="aac,ac3,eac3,mp3" />
    <VideoProfile protocol="hls" container="mp4" codec="h264" audioCodec="aac,ac3,eac3,mp3" />
    <VideoProfile protocol="hls" container="mp4" codec="hevc" audioCodec="aac,ac3,eac3,mp3" />
    <MusicProfile container="mp3" codec="mp3" />
    <MusicProfile container="mp4" codec="aac" />
    <MusicProfile container="mp4" codec="alac" />
    <MusicProfile container="flac" codec="flac" />
    <PhotoProfile container="jpeg,gif,bmp,png" />
  </DirectPlayProfiles>
  <CodecProfiles>
    <VideoCodec name="h264">
      <Limitations>
        <UpperBound name="video.width" value="3840" isRequired="true" />
        <UpperBound name="video.height" value="2160" isRequired="true" />
        <UpperBound name="video.bitDepth" value="8" />
        <NotMatch name="video.separateFields" value="1" />
      </Limitations>
    </VideoCodec>
    <VideoCodec name="hevc">
      <Limitations>
        <UpperBound name="video.width" value="3840" isRequired="true" />
        <UpperBound name="video.height" value="2160" isRequired="true" />
        <UpperBound name="video.bitDepth" value="10" />
        <NotMatch name="video.separateFields" value="1" />
        <UpperBound name="video.width" value="1920" onlyTranscodes="true" />
        <UpperBound name="video.height" value="1080" onlyTranscodes="true" />
        <UpperBound name="video.bitDepth" value="8" onlyTranscodes="true" />
      </Limitations>
    </VideoCodec>
    <VideoAudioCodec name="*">
      <Limitations>
        <UpperBound name="audio.channels" value="2" onlyTranscodes="true" />
      </Limitations>
    </VideoAudioCodec>
  </CodecProfiles>
</Client>
  1. H/w transcoding and transcoding folder specified in Plex Server under Settings/Transcoder
  2. Restart the server and try it out.

Thanks for report.