selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

ffmpeg-over-ip logo

Self-host ffmpeg-over-ip

v6.0.0

GPU ffmpeg transcoding over one TCP port, no passthrough

ReleaseOpen SourceOther
docker run -e FFMPEG_OVER_IP_CLIENT_ADDRESS=192.168.1.100:5050 -e FFMPEG_OVER_IP_CLIENT_AUTH_SECRET=your-secret -v ./ffmpeg-over-ip-client:/usr/bin/ffmpeg your-image
Updatedlast week
LanguageGo
Setup difficultyEasy
Stars
1 196
Port
5050 (TCP port the server daemon listens on for client command connections)

What is ffmpeg-over-ip?

ffmpeg-over-ip is an open-source client/server pair that lends a media server the transcoding power of a GPU it cannot reach locally. The daemon runs where the GPU lives and hosts a patched ffmpeg; on the app side you swap ffmpeg for the client binary, which forwards the command line across one TCP connection and shuttles data back and forth with the machine holding the real files, so nothing gets copied remotely and no passthrough or NFS/SMB share is required. Each release bundles patched ffmpeg and ffprobe from the jellyfin-ffmpeg build pipeline, with hardware encode support spanning NVENC, QSV, VAAPI, AMF and VideoToolbox. Access control works via a common secret plus HMAC-SHA256 command signatures; several clients may share one server, server-side rewrites can substitute codecs the hardware lacks, and the client can revert to a local ffmpeg whenever the server is unreachable. Operators deploy it with a one-line shell or PowerShell installer, by extracting a release archive, or by bind-mounting the client binary into a container, and configure it through a JSONC file or environment variables. It publishes no container images of its own, and its docs describe plain TCP with authentication rather than transport encryption.

Should you self-host ffmpeg-over-ip?

ffmpeg-over-ip scores 52/100 on selfhost.directory (how scoring works) and ranks #6 of 18 in Video Processing. It has 1 196 GitHub stars.

It shipped 6 stable releases in the past year. The latest, v6.0.0, came out on 19 October 2026. New versions land roughly every 4 weeks.

Setup is easy: most people get it running in one sitting. It is Other-licensed and written mostly in Go.

Its closest alternative on selfhost.directory is Concat (82/100, 12 301 stars). It scores higher overall, so compare the two before you pick. See ffmpeg-over-ip vs Concat side by side.

Features

  • Codec argument rewrites
  • Configurable logging
  • Ffprobe proxy mode
  • Hardware-accelerated transcoding
  • HMAC-SHA256 Authentication
  • Idempotent install scripts
  • Local ffmpeg fallback
  • Multiple concurrent clients
  • Single-port network model
  • Tunable read-ahead and range cache
  • Tunneled file I/O
  • Unix domain socket transport

ffmpeg-over-ip README

How to install ffmpeg-over-ip

Install ffmpeg-over-ip with Docker

Environment variables
FFMPEG_OVER_IP_CLIENT_ADDRESS, FFMPEG_OVER_IP_CLIENT_AUTH_SECRET, FFMPEG_OVER_IP_SERVER_ADDRESS, FFMPEG_OVER_IP_SERVER_AUTH_SECRET

Mount the client binary as /usr/bin/ffmpeg and pass config via environment variables:

docker run \
  -e FFMPEG_OVER_IP_CLIENT_ADDRESS=192.168.1.100:5050 \
  -e FFMPEG_OVER_IP_CLIENT_AUTH_SECRET=your-secret \
  -v ./ffmpeg-over-ip-client:/usr/bin/ffmpeg \
  your-image

No published images: the client or server binary is bind-mounted into your own image, and a Unix socket can be used when server and client share a machine.

How to configure ffmpeg-over-ip

  • addressServer listen address (host:port or unix:/path), or the server address the client connects to

    Server listen address (host:port or unix:/path), or the server address the client connects to

  • authSecretShared HMAC auth secret, required and identical on client and server

    Shared HMAC auth secret, required and identical on client and server

  • --configCLI flag giving the server an explicit config file path (highest resolution priority)

    CLI flag giving the server an explicit config file path (highest resolution priority)

  • debugfalseLog the original and rewritten arguments of each command

    Log the original and rewritten arguments of each command

  • --debug-print-search-pathsCLI flag that prints the config file search paths probed on the system

    CLI flag that prints the config file search paths probed on the system

  • fallbackRewritesRewrite pairs applied only when the local ffmpeg fallback runs

    Rewrite pairs applied only when the local ffmpeg fallback runs

  • fallbackToLocalfalseClient option to exec the host's local ffmpeg when the server cannot be reached

    Client option to exec the host's local ffmpeg when the server cannot be reached

  • FFMPEG_OVER_IP_CLIENT_ADDRESSServer address (`host:port` or `unix:/path`)

    Server address (`host:port` or `unix:/path`)

  • FFMPEG_OVER_IP_CLIENT_AUTH_SECRETHMAC auth secret (must match server)

    HMAC auth secret (must match server)

  • FFMPEG_OVER_IP_CLIENT_CONFIGPath to a client config file, taking precedence over individual env vars

    Path to a client config file, taking precedence over individual env vars

  • FFMPEG_OVER_IP_CLIENT_DEBUGLog original/rewritten args when fallback runs (`true`, `1`, `yes`, `y` — case-insensitive)

    Log original/rewritten args when fallback runs (`true`, `1`, `yes`, `y` — case-insensitive)

  • FFMPEG_OVER_IP_CLIENT_FALLBACK_TO_LOCALRun local ffmpeg if the server is unreachable (`true`, `1`, `yes`, `y` — case-insensitive)

    Run local ffmpeg if the server is unreachable (`true`, `1`, `yes`, `y` — case-insensitive)

  • FFMPEG_OVER_IP_CLIENT_LOGLog destination: `stdout`, `stderr`, or file path

    Log destination: `stdout`, `stderr`, or file path

  • FFMPEG_OVER_IP_SERVER_ADDRESSListen address (`host:port` or `unix:/path`)

    Listen address (`host:port` or `unix:/path`)

  • FFMPEG_OVER_IP_SERVER_AUTH_SECRETHMAC auth secret (must match client)

    HMAC auth secret (must match client)

  • FFMPEG_OVER_IP_SERVER_CONFIGPath to a server config file, taking precedence over individual env vars

    Path to a server config file, taking precedence over individual env vars

  • FFMPEG_OVER_IP_SERVER_DEBUGLog original/rewritten args (`true`, `1`, `yes`, `y` — case-insensitive)

    Log original/rewritten args (`true`, `1`, `yes`, `y` — case-insensitive)

  • FFMPEG_OVER_IP_SERVER_LOGLog destination: `stdout`, `stderr`, or file path

    Log destination: `stdout`, `stderr`, or file path

  • FFOIP_RANGE_CACHE_BYTES268435456 (256 MiB)Maximum bytes of previously-read ranges cached per open file, so backward seeks and re-reads are served without a round trip. Only applies to read-only files of 256 MiB or smaller. Set to `0` to disable the range cache.

    Maximum bytes of previously-read ranges cached per open file, so backward seeks and re-reads are served without a round trip. Only applies to read-only files of 256 MiB or smaller. Set to `0` to disable the range cache.

  • FFOIP_READAHEAD_BYTES2097152 (2 MiB)Maximum read-ahead window per open file. The window starts small and grows toward this value on sustained sequential reads. Values above 16 MiB are clamped. Set to `0` to disable read-ahead and prefetch entirely (one network read per ffmpeg read).

    Maximum read-ahead window per open file. The window starts small and grows toward this value on sustained sequential reads. Values above 16 MiB are clamped. Set to `0` to disable read-ahead and prefetch entirely (one network read per ffmpeg read).

  • logfalseLog destination: stdout, stderr, a file path, or false/omitted to disable logging

    Log destination: stdout, stderr, a file path, or false/omitted to disable logging

  • rewritesServer-side argv substitution pairs (find, replace) applied before running ffmpeg

    Server-side argv substitution pairs (find, replace) applied before running ffmpeg

ffmpeg-over-ip releases & version history

More in CLI Tools

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…