Network reference
Ports, discovery, wire format, forward error correction, pacing, keepalive and firewall rules for the PreviewMonitor stream.
PreviewMonitor streams over your local network with no server in between. The plugin listens for one TCP control connection and pushes UDP video and audio at whichever phone is connected. Everything below is fixed — there is nothing to configure and no port to change.
Ports
| Port | Protocol | Direction | Carries |
|---|---|---|---|
| 47100 | TCP | iPhone → host (host listens) | Control channel for Premiere Pro |
| 47110 | TCP | iPhone → host (host listens) | Control channel for After Effects |
| 47101 | UDP | host → iPhone (iPhone listens) | Encoded video fragments |
| 47102 | UDP | host → iPhone (iPhone listens) | PCM audio fragments |
| 5353 | UDP | both ways, multicast | mDNS / Bonjour discovery |
The control ports are spaced ten apart per Adobe host so two hosts can run on one machine without colliding. Premiere Pro keeps 47100 exactly; After Effects gets 47110. Each host also gets its own advertised identity and its own list of trusted phones — see Two hosts, one machine.
The video and audio ports are the same for every host, because only one phone streams at a time.
IPv4 only. There is no IPv6 path.
Discovery
The plugin advertises itself over mDNS as service type _premierelive._tcp
(_premierelive._tcp.local on Windows). premierelive is the internal
engineering name; it is not shown anywhere in the interface.
The TXT record carries five keys:
| Key | Value | Meaning |
|---|---|---|
ver | 5 | TXT record schema version. The app reads this to know which keys to expect. |
id | UUID | The host's stable identity. The app keys its saved-hosts list by this, so a host that changes IP or name is still recognized. |
name | string | The display name from the Setup window's Name field. |
transmit | 0 or 1 | 1 when Premiere Pro has at least one Transmit instance activated — that is, the device is ticked in Preferences → Playback and a sequence is open. The app uses this to show "Transmit stopped" without opening a connection first. |
pv | version string | The plugin's build version, so the app can tell a stale plugin from a current one. |
transmit changes at most once per second. Unknown keys are ignored by the app,
so an older app build and a newer plugin still find each other.
On Windows the advertiser uses the native Windows DNS-SD API (dnsapi).
Apple's Bonjour for Windows is not required and does not need to be
installed. On macOS it uses the system Bonjour daemon.
Discovery is a convenience, not a dependency. If mDNS is blocked — as it is on many managed and guest networks — you can still connect by scanning the QR code in the Setup window or by typing the host's IP address. Turning off Discoverable on network stops the advertisement without stopping the stream.
The app gives discovery 8 seconds after you tap a host before it gives up and returns you to the home screen.
On Windows a single machine can currently advertise several near-identical registrations, so the phone's device list shows the same PC more than once. Every row resolves to the same host, port and identity — tap any of them. See Known limitations.
Wire format
Every UDP packet, video or audio, begins with a fixed 22-byte header. The magic
is PLV\2; a receiver that does not recognize it drops the packet rather than
mis-parsing it.
| Offset | Size | Field |
|---|---|---|
| 0 | 4 | Magic PLV\2 |
| 4 | 1 | Type — 1 video, 2 audio |
| 5 | 1 | Flags — bit 0 keyframe, bit 1 transmit-timestamp trailer present, bits 2–7 parity shard count (0–63) |
| 6 | 2 | Frame sequence, u16 LE — one per encoded frame, shared by all its fragments |
| 8 | 4 | Packet index, u32 LE — per-stream monotonic, for instant loss detection |
| 12 | 4 | Timestamp, u32 LE microseconds |
| 16 | 2 | Fragment index, u16 LE |
| 18 | 2 | Fragment total, u16 LE — data plus parity |
| 20 | 2 | Payload length, u16 LE |
| 22+ | — | Payload |
The per-packet index in addition to the per-frame sequence is what lets the receiver notice a single lost fragment immediately, rather than waiting for a frame to fail to assemble.
Why the payload is 1440 bytes
The design target is LAN Wi-Fi with a standard 1500-byte MTU, and the whole point is that no packet is ever fragmented by IP:
1500 Ethernet MTU
-20 IPv4 header
-8 UDP header
-22 PreviewMonitor packet header
-2 parity shard length prefix
────
1448 theoretical maximum payload
1440 what is actually usedThe 8-byte difference is deliberate headroom for VLAN tags and stray IP options on real networks. 1440 is a constant on both sides — the plugin and the app derive the forward-error-correction block size from it independently, and they have to agree exactly or parity reconstruction produces garbage.
The fragment-total field is a u16, so a single encoded frame can be up to 65535 fragments — about 94 MB, far more than any real frame.
Forward error correction
FEC is fixed at 10% parity, Reed-Solomon, using cm256. There is no adaptive FEC and no setting for it.
For a frame that splits into k data fragments, the plugin computes
ceil(k × 0.10) parity shards. So a 20-fragment frame gets 2 parity shards and
a 21-fragment frame gets 3. Any 20 of the 22 shards reconstruct the frame.
FEC is skipped entirely in three cases:
| Case | Why |
|---|---|
| The frame needs more than 255 data fragments | cm256's hard limit on original shards. A frame larger than about 367,000 bytes skips FEC rather than being dropped. |
| Parity would exceed 63 shards | The parity count lives in six bits of the flags byte, so it is clamped to 63. |
| Audio, always | Audio fragments carry no parity at all. |
On LAN Wi-Fi, which is the only supported transport, loss is rare enough that a very large frame going out unprotected is an acceptable trade against dropping it.
Pacing
The plugin does not hand a whole keyframe to the kernel at once. A pacer refills a token bucket at the current bit rate divided by eight, and drains fragments against it, so a frame's packets are smeared across the frame interval instead of arriving as a burst that overruns the Wi-Fi link's buffer.
The backlog is bounded, per stream:
| Stream | Maximum queued frames |
|---|---|
| Video | 5 |
| Audio | 4 |
On overflow the oldest queued frame of that stream is dropped, not the newest — a stale frame is worth less than a fresh one on a live monitor. There is also an independent byte cap on the video queue, because a large queue that is technically under the frame limit still reads to the eye as a stuck picture.
Dropped frames are counted and surfaced in the stats HUD.
There is no retransmission
Nothing is ever re-sent. A lost fragment is either reconstructed from parity or it is gone. Recovery is exactly two mechanisms:
- FEC, as above, which absorbs the common case of one or two lost fragments in a frame.
- Keyframe on demand. When the app cannot decode — too many fragments lost
in one frame, or a decoder reset — it sends a one-byte request (opcode
0x01) on the control channel and the plugin forces the encoder to emit an IDR immediately.
This is why GOP Mode matters on a lossy network. In All-Intra every frame is independent, so a lost frame costs one frame. In Long a lost frame can corrupt everything up to the next keyframe, which is what the on-demand IDR exists to cut short.
Keepalive and heartbeat
Two independent mechanisms keep the control channel honest.
| Mechanism | Timing | Purpose |
|---|---|---|
| Application heartbeat | one empty control message (opcode 0x09) from host to phone every 1 second | Keeps iOS from marking a quiet TCP connection non-viable and forcing a reconnect. A send failure is also how the plugin notices a half-open socket quickly. |
| TCP keepalive | first probe after 10 s idle, then every 5 s, 3 probes before giving up | Detects a silently dead peer within roughly 25 seconds instead of the operating system's default minute-plus. |
One phone at a time
The plugin accepts one TCP control connection. When a second phone connects, the new connection replaces the old one: the previous socket is closed and its control and heartbeat threads exit.
The replacement is not trusted by inheritance. A newly accepted connection is marked unauthenticated, and UDP video and audio are gated on authentication — so a phone that connects but does not complete pairing gets no picture, even though the stream is now aimed at its address. See Trusted devices.
LAN only, by design
Both devices must be on the same local network. There is no internet path, no relay, no VPN support and no IPv6 tunnel.
This is a design decision, not a missing feature, and it is what buys the rest of the product's shape:
- No account, no login, no cloud. Entitlement is resolved on-device against your Apple ID; nothing about your edit leaves your network.
- No upload. Your frames go from Premiere Pro to your phone across your own Wi-Fi and nowhere else.
- Latency you can trust. A reference monitor whose picture might be a second behind is not a reference monitor. LAN-only is what keeps the budget in tens of milliseconds.
- Fixed 1440-byte payloads. Sizing for one known MTU removes an entire class of path-MTU failure.
Firewall
Windows
The installer writes three inbound firewall rules, all named PreviewMonitor,
on both the private and public profiles, so Premiere Pro never raises the
"Private / Public networks" dialog. That dialog is a trap: its checkbox has to
match how Windows classified your Wi-Fi (new networks default to Public), and
picking wrong — or pressing Cancel, which writes a Block rule — silently kills
discovery and streaming.
netsh advfirewall firewall add rule name="PreviewMonitor" dir=in action=allow protocol=TCP localport=47100,47110,47120,47130 profile=private,public
netsh advfirewall firewall add rule name="PreviewMonitor" dir=in action=allow protocol=UDP localport=47101-47102 profile=private,public
netsh advfirewall firewall add rule name="PreviewMonitor" dir=in action=allow protocol=UDP localport=5353 profile=private,publicThe rules are port-scoped rather than program-scoped, because the Premiere
Pro executable's path changes with every version. Existing PreviewMonitor
rules are deleted before the new ones are added, so reinstalling does not stack
duplicates, and uninstalling removes them.
Ports 47120 and 47130 are in the TCP rule as reserved control ports for other Adobe hosts; nothing supported listens on them.
If you installed by MSI rather than by the .exe, no firewall rules are
written — the MSI installs the plugins only. Add the rules by hand with the
commands above, from an elevated prompt.
macOS
Nothing in PreviewMonitor touches the macOS firewall. The first time Premiere Pro loads the plugin and it opens its listening socket, macOS asks whether Premiere Pro may accept incoming network connections. That prompt comes from the operating system, names Adobe Premiere Pro rather than PreviewMonitor, and has to be answered Allow — denying it blocks the control channel and the phone will never connect.
If you dismissed it or clicked Deny, fix it in System Settings → Network → Firewall → Options, not in PreviewMonitor.
Related
Last updated on
Settings reference
Every PreviewMonitor setting in one place — label, control, options, default, what it changes, and whether it needs Pro.
Picture and color
What the phone shows versus the Program Monitor — pixel format, alpha handling, BT.709 conversion, missing color tags, and the two platforms' scalers.