AirPlayServer receives AirPlay video, audio, and screen mirroring on Windows.
This project is an updated fork of fingergit/airplay2-win.
- Download AirPlay2-Win-x64.zip.
- Extract the archive.
- Install Bonjour for Windows if it is not already installed. iTunes also includes Bonjour.
- Run
AirPlayServer.exe.
The app warns you at startup if Bonjour is missing or its service is not running.
- Windows 10 or later, x64
- Apple Bonjour for Windows, used for device discovery over mDNS
- Screen mirroring and audio from iOS and macOS; unsupported standalone URL/HLS playback is not advertised
- 30 and 60 FPS quality presets
- GPU texture upload and YUV to RGB conversion
- Frame pacing for smoother playback
- Live window resizing
- Receiver resolution matched to a monitor or set manually
- Automatic Bonjour service advertisement
- Start AirPlayServer.
- Open Control Center on an iPhone or iPad, or open the AirPlay menu on a Mac.
- Select the Windows PC from the list.
- Start mirroring or playback.
Open Settings and use AirPlay resolution to control the display size advertised to macOS. Match receiver monitor is the default: while the receiver is idle, move its window to the Windows monitor you want to match. The advertised size follows that monitor's current mode.
Select Custom to enter an exact width and height, such as 1920 x 1080 or 2560 x 1440. Resolution changes are applied when the receiver is idle. Stop and reconnect Screen Mirroring on the Mac to negotiate the new size; an active stream is never interrupted.
To collect diagnostics for playback or audio-output switching issues, start the
server with AirPlayServer.exe --debug. A new timestamped log is written for
each run under %LOCALAPPDATA%\AirPlayServer\logs (or the system temporary
directory if LOCALAPPDATA is unavailable). The log includes startup and
shutdown, connection/device identifiers, AirPlay protocol messages, playback
and volume callbacks, thread IDs, and unhandled exception details. Debug mode
is opt-in and does not create log files during normal launches.
Enable Require PIN from the home screen to approve new connections with a temporary four-digit code. The PIN exists only in memory for the current server session and is never written to disk.
Hide PIN from screen capture protects the code from supported Windows recording APIs. After you accept a connection, AirPlayServer enables capture exclusion and waits one second before displaying the PIN locally. The exclusion remains active until the device connects or you cancel. If Windows cannot enable capture exclusion, the app does not display the PIN.
| Key | Action |
|---|---|
H |
Toggle session controls |
Ctrl+Shift+H |
Toggle capture privacy |
P |
Toggle picture-in-picture mode |
F or double-click |
Toggle fullscreen |
F1 |
Toggle diagnostics while connected |
R |
Rotate video 90 degrees clockwise |
| Mouse wheel | Zoom from fit to 5x |
| Left-drag while zoomed | Pan the video |
| Mouse movement | Show the cursor; it hides after five seconds |
The session controls include Hide from captures. This keeps the receiver visible on the local monitor, excludes its main window from supported Windows capture APIs, and sends a black frame to the clean feed. Select Show in captures or press Ctrl+Shift+H to turn it off.
Select Picture in picture or press P to open a small, borderless window that stays above other apps. PiP uses the current device's aspect ratio when resized. Move the pointer over the window to reveal the close button. You can drag the invisible strip along the top to move it. Press P again to restore the previous window size, position, and maximized state. PiP also closes when the device disconnects.
Enable Screen Cast mode from the session controls to create a separate video-only window named AirPlay Receiver - Clean Feed. The normal receiver window remains available on the local display.
To use it in OBS:
- Add a Window Capture source and choose the Windows 10/11 capture method.
- Select
AirPlay Receiver - Clean Feed. - Turn off
Capture Cursorin OBS.
In Discord, open Share Your Screen, choose Applications, and select AirPlay Receiver - Clean Feed. The window exists only while a device is connected and AirPlayServer is rendering video.
The clean feed follows rotation, zoom, pan, and receiver window resizing. Crop clean feed to video removes letterboxing and pillarboxing. AirPlayServer hides the clean feed between sessions and restores it after a device reconnects.
Hide interface from captures excludes the local receiver from supported Display Capture paths on Windows 10 version 2004 and later. It is meant to keep controls out of a presentation. It is not DRM. Use Window Capture in OBS for the clean feed.
You can change the preset from the session controls while video is playing.
| Preset | FPS | Scaling | Intended use |
|---|---|---|---|
| Best | 30 | Best available | Sharpest image |
| Balanced | 60 | Best available | Default setting |
| Low latency | 60 | Linear | Fastest response |
- Check that Bonjour is installed and that
Bonjour Serviceis running inservices.msc. - Put both devices on the same Wi-Fi network and subnet.
- Allow AirPlayServer through Windows Firewall on private networks.
- If Windows is running in a virtual machine, use bridged networking instead of NAT.
- Disconnect any VPN or proxy that may be intercepting the local connection.
The MirrorSimAdapter sidecar exposes protocol 0.8.0, including bounded H.264 access-unit and interleaved signed 16-bit PCM audio events, sender-volume changes, receiver-reported source/video geometry, and explicit mirror sender pause/resume events over JSONL. The source-screen shape provides orientation without mistaking a separate landscape media surface for a rotated phone. Video and audio serialization run on bounded worker queues so a busy desktop client cannot block the AirPlay network callback; overloaded video output drops forward to the next decoder keyframe instead of building an unbounded backlog, and repeated codec-only packets are deduplicated.
When a host sets MIRRORSIM_EXTERNAL_DNSSD=1, the headless adapter skips its Bonjour client registration and lets the host advertise _airplay._tcp and _raop._tcp itself. MIRRORSIM_HARDWARE_ADDRESS accepts the shared 12-digit hexadecimal discovery identity, keeping AirPlay identity stable between the native protocol server and the external advertiser.
The headless adapter advertises mirroring and audio capabilities only. Media apps therefore remain inside the mirrored screen instead of handing standalone playback to the receiver's intentionally unsupported URL/HLS path.
Mirror timing requests use a 300 ms response window and a three-second cadence. Timing failures and AirPlay control lifecycle transitions are summarized on stderr for MirrorSim diagnostics without flooding the sender or the support log.
The projects target Visual Studio 2026 with the v145 toolset and a Windows 10 SDK.
With Visual Studio 2022, build from a Developer Command Prompt using
msbuild AirPlay.sln /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /m.
-
Clone the repository
git clone https://github.com/xenos1337/AirPlayServer.git
-
Open
AirPlay.slnin Visual Studio. -
In Solution Explorer, right-click
AirPlayServerand selectSet as Startup Project. -
Build with
Ctrl+Bor run withF5.
The Debug executable is written to x64\Debug\AirPlayServer.exe.
AirPlayServer/
|-- AirPlayServer/ # Windows GUI, SDL2, and ImGui
| |-- CSDLPlayer.cpp # Video and audio playback
| |-- CImGuiManager.cpp # Home screen and session controls
| |-- CAirServer.cpp # AirPlay server wrapper
| `-- CAirServerCallback.cpp
|-- AirPlayServerLib/ # AirPlay 2 protocol library
| `-- lib/ # RAOP, pairing, crypto, and codecs
|-- airplay2dll/ # DLL wrapper and FFmpeg H.264 decoder
|-- MirrorSimAdapter/ # Headless JSONL adapter
|-- tests/ # Codec and protocol smoke tests
|-- dnssd/ # Bonjour discovery DLL
|-- external/ # SDL2, FFmpeg, ImGui, and other dependencies
`-- AirPlay.sln
Bug reports, feature requests, and pull requests are welcome. Follow the existing C++ and Windows API style, test on Windows 10 or 11, and update the documentation when behavior changes.
Repository-authored code is provided under the MIT license. The receiver also uses OSI-approved third-party components, including dynamically linked FFmpeg under LGPL-2.1-or-later, libplist under LGPL-2.1-or-later, and PlayFair interoperability code under GPL-3.0. See THIRD_PARTY_NOTICES.md for component scope, exact FFmpeg build provenance, source availability, and license locations.
Thanks to fingergit and the AirPlay reverse engineering community.
This is an unofficial implementation. Apple, AirPlay, and related trademarks belong to Apple Inc.





