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.
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 subtitles | PGS/VOBSUB are dropped with a notice rather than burned in. SRT/ASS work. |
| Start position | The 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 space | A 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.