Let your Mac handle the transcodes. Keep Plex on your Linux server.
Turn a Mac mini or another supported Mac into an external video engine for your Linux homelab. VideoToolbox Remote sends video over your LAN to Apple's dedicated media hardware for high-quality H.264 (AVC), H.265 (HEVC) and HEVC Main 10 transcoding. Low-powered, GPU-less Linux servers and NAS devices keep hosting Plex and serving media while the Mac handles supported video decode, resize and encode.
Use it for high-quality Plex transcodes, low-power batch video conversion with FFmpeg, stock Linux VA-API encoding, or an experimental remote OBS Studio encoder. FFmpeg clients run on Linux, Windows and macOS; the VideoToolbox daemon runs on macOS 13+.
Documentation · Plex setup · Download binaries · Performance
- Keep Plex, storage and media delivery on Linux. The supported Plex video path runs on the Mac and needs no Linux GPU or DRM render node.
- Use dedicated VideoToolbox media hardware for low-power playback transcodes and batch queues. Published results measure quality and CPU offload; whole-system watt measurements are still needed.
- Control output quality with H.264, HEVC and 10-bit HEVC, including bitrate, profile and color settings. Performance benchmarks compare Intel VA-API, CPU fast/medium, local VideoToolbox and remote VideoToolbox using Big Buck Bunny and FFmpeg signals, with graphs of throughput, video quality and CPU time alongside actual file sizes and bitrates.
- Keep LAN traffic low with packet transcoding, which sends compressed video in both directions. Choose raw-frame remote encoding when you need local filters or live sources.
| Workflow | What runs on the Mac | Setup and scope |
|---|---|---|
| Plex on Linux / a GPU-less NAS | H.264/HEVC decode, resize and encode | Plex Docker guide. Linux x86_64 container; supported Plex library builds and filter graphs only. Plex Pass required for normal hardware-accelerated playback. |
| FFmpeg batch transcodes | Encode, decode, or packet-to-packet transcode | Getting started. Patched FFmpeg clients for Linux, Windows and macOS. |
| Stock Linux VA-API applications | H.264/HEVC encode | VA-API driver. Linux x86_64; software decode/filter/upload and a render node remain local. |
| OBS Studio live encoding | H.264/HEVC encode | OBS plugin. Experimental; build from source and validate your recording/streaming workflow. |
| Custom C applications | Encode through the shared protocol client | Static C SDK. Experimental API; rebuild with the matching release. |
Download matching archives from the latest release and check their SHA-256 checksums. On an Apple Silicon Mac:
tar -xzf vtremoted-macos-arm64.tar.gz
brew install lz4 zstd
# Bind to the Mac's private LAN address. Use a token or tunnel when sharing it.
./vtremoted/vtremoted --listen 192.168.1.20:5555 --log-level 1On a Linux x86_64 FFmpeg client:
mkdir -p ffmpeg-client
tar -xzf ffmpeg-linux-x86_64.tar.gz -C ffmpeg-client
./ffmpeg-client/ffmpeg -i input.mkv \
-c:v h264_videotoolbox_remote \
-vt_remote_host 192.168.1.20:5555 \
-b:v 6M -c:a copy -c:s copy \
output.mkvReplace the example IP with your Mac's address. The daemon defaults to loopback if --listen is omitted. Tokens authenticate but do not encrypt traffic; use an SSH tunnel or VPN on untrusted networks. See security.
For H.264/HEVC input that needs only supported server-side video operations, send compressed packets to the Mac and receive compressed HEVC output:
./ffmpeg-client/ffmpeg -i input.mkv -map 0 -c copy \
-vt_remote_transcode:v:0 \
-vt_remote_host 192.168.1.20 -vt_remote_port 5555 \
-vt_remote_out_codec:v:0 hevc -b:v:0 6M \
output.mkvThe Mac handles video decode, optional resize/pixel-format conversion and encode. Files, audio, subtitles and muxing stay on the client. Arbitrary FFmpeg filters are not offloaded by packet mode; use remote encoding after local decode/filtering when needed.
| Release asset | Platform / purpose |
|---|---|
vtremoted-macos-arm64.tar.gz |
Apple Silicon server, macOS 13+ |
vtremoted-macos-x86_64.tar.gz |
Intel server with supported VideoToolbox hardware, macOS 13+ |
ffmpeg-linux-x86_64.tar.gz |
Linux x86_64 FFmpeg client |
ffmpeg-linux-arm64.tar.gz |
Linux arm64/aarch64 FFmpeg client; Ubuntu 24.04-compatible runtime |
ffmpeg-macos-arm64.tar.gz, ffmpeg-macos-x86_64.tar.gz |
macOS FFmpeg clients |
ffmpeg-windows-x86_64.tar.gz |
Windows x86_64 FFmpeg client |
vtremote-vaapi-linux-x86_64.tar.gz |
Linux VA-API driver, Plex packet shim and experimental static C SDK |
vtremote-vaapi-*-source.tar.gz |
Matching driver/shim/SDK source bundle |
SHA256SUMS.txt, *.sha256 |
Release checksums |
The Linux arm64 FFmpeg archive is dynamically linked and requires glibc 2.39+ and matching shared libraries, including libvmaf 3.0.0. Build from source for Debian 12 or Raspberry Pi OS Bookworm. Runtime requirements. VA-API and Plex release integrations are Linux x86_64 only; there is no 32-bit i686 release.
vtremoted is a lightweight Swift daemon wrapping VideoToolbox. FFmpeg remote codecs, the VA-API driver, the Plex packet shim and the OBS plugin share a TCP protocol. Protocol v1 keeps its existing message layouts; optional media features are capability-negotiated.
- Remote encode: raw frames → Mac → H.264/HEVC packets.
- Remote decode: H.264/HEVC packets → Mac → raw frames.
- Remote transcode: H.264/HEVC packets → Mac decode/resize/encode → packets.
Wired LAN is recommended. Raw frames can require substantial bandwidth, especially at 4K/10-bit; LZ4/Zstd compression depends on content. Packet mode is usually the better fit for a low-powered Plex host or batch conversion without local video filters.
The general VA-API driver is encode-only and does not provide decode, VPP, tone mapping, B-frames or external DMA-BUF surfaces. The Plex container uses a separate packet path, checks the bundled codec library and supported graph, and leaves unsupported commands on Plex's native path. Native processing may still use Linux CPU. See the guides for exact constraints.
make build-vtremoted # macOS server
make build-ffmpeg # FFmpeg client, on the target OSThe server loads LZ4/Zstd at runtime when requested. Client builds need the corresponding development libraries. Development covers toolchains, tests, release checks and the Linux assembler diagnostic.
Remote option and metadata coverage includes common software-frame uploads, negotiated VideoToolbox hardware-frame ingest/output, HEVC pixel formats, HDR/color signaling and typed side data. Hardware frames are uploaded across hosts, not shared as zero-copy handles. See architecture, protocol and integration tests.
Issues and pull requests are welcome. Include the server/client OS, command, release or commit, vtremoted --version and logs. Read CONTRIBUTING.md, troubleshooting and SECURITY.md.
FFmpeg-style licensing: LGPL v2.1+ by default, with optional GPL components depending on the FFmpeg configuration. See LICENSE.md, COPYING.LGPLv2.1 and FFmpeg's license.