Cast what IINA is playing to your Apple TV.

No screen mirroring, no re-encode. The plugin hands the file to the TV, and IINA stays the remote.

Install through IINA Settings → Plugins → Install → ozykhan/iina-airplay

macOS 12+ · any AirPlay 2 receiver · MIT · everything bundled, nothing downloads at runtime

Demo footage: Sintel © Blender Foundation, CC BY 3.0.

The picture is the file.

Remux-first, so in the normal case the TV plays the original bitstream bit-for-bit. Only unusual codecs get re-encoded, through VideoToolbox.

IINA is the remote, both ways.

Play, pause and seek in IINA drive the Apple TV; the Siri Remote comes back the other way.

Your subtitles come along.

The text track you selected in IINA, embedded or external SRT/ASS, is carried as a WebVTT rendition the TV shows through its own menu.

Nothing to install first.

A pinned LGPL ffmpeg build and a small Go helper ship inside the package. No Homebrew, no runtime downloads, works offline.

Limits, up front

macOS 15+Grant IINA the Local Network permission on first cast, or the TV can't reach the stream.
Image subtitlesPGS/VOBSUB are dropped with a notice rather than burned in. SRT/ASS work.
Start positionThe TV starts from the beginning, then jumps to where IINA was once packaging has reached that point. Best-effort: if the TV ends up elsewhere, IINA follows the TV.
Disk spaceA cast writes a second copy of the file (the HLS remux) to IINA's temp directory for as long as it runs. It is deleted when the cast stops or IINA quits.

Install

Install through IINA, not by downloading the package in a browser:

IINA → Settings → Plugins → Install → ozykhan/iina-airplay

IINA fetches the package from the latest GitHub release and extracts it without applying the quarantine flag, so the bundled binaries run under Gatekeeper with their ad-hoc signatures. A package downloaded in a browser and opened by hand is quarantined all the way down, and the plugin will ask you to reinstall through IINA if that happens.

On macOS 15 and later, grant IINA the Local Network permission the first time it casts, or the Apple TV cannot reach the stream.

Everything the plugin needs ships inside the package. There are no prerequisites and nothing is downloaded at runtime.

To cast, play a file and pick Plugins → AirPlay → Cast to TV from the menu bar, or open the sidebar's Plugins pane, choose the AirPlay tab and press Start casting. Once the file is packaged, Send to TV opens the AirPlay picker. The plugin's page under Settings → Plugins only enables it and shows its log; the controls live in the sidebar.

How it works

IINA cannot AirPlay its own video output: it renders through mpv into a Metal/OpenGL layer, and macOS only exposes AirPlay video sending through AVFoundation. So this is a handoff, not a mirror. The plugin remuxes the current file to a live HLS stream (transcoding only when the codec demands it), serves it on your LAN, and a hidden video element in IINA's sidebar hands the stream URL to the TV through WebKit's own AirPlay picker. IINA keeps playing muted alongside, which is what makes the two-way remote control work.

The full reasoning and the codec and subtitle handling matrix are in docs/feasibility.md.