﻿﻿{"id":2909,"date":"2026-05-04T16:15:18","date_gmt":"2026-05-04T14:15:18","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/ffmpeg-over-ip-le-transcodage-gpu-distant-pour-jellyfin\/"},"modified":"2026-05-04T16:15:18","modified_gmt":"2026-05-04T14:15:18","slug":"ffmpeg-over-ip-le-transcodage-gpu-distant-pour-jellyfin","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/ffmpeg-over-ip-le-transcodage-gpu-distant-pour-jellyfin\/","title":{"rendered":"ffmpeg-over-ip &#8211; Le transcodage GPU distant pour Jellyfin"},"content":{"rendered":"<p>Jellyfin sans GPU, c&#8217;est la croix et la banni\u00e8re d\u00e8s que quelqu&#8217;un lance un film en 4K. Mais c&#8217;\u00e9tait sans compter sur<br \/>\n<a href=\"https:\/\/github.com\/steelbrain\/ffmpeg-over-ip\">ffmpeg-over-ip<\/a><br \/>\nqui est capable de transformer un serveur \u00e9quip\u00e9 d&#8217;un GPU en endpoint de transcoding distant, accessible via un simple binaire qui se fait passer pour ffmpeg. Y&#8217;a pas de passthrough GPU, ni besoin de vous lancer dans la config de point de montage r\u00e9seau exotique.<\/p>\n<p>Le principe c&#8217;est que le client re\u00e7oit les commandes ffmpeg de<br \/>\n<a href=\"https:\/\/korben.info\/jellyfin-le-media-center-libre.html\">Jellyfin<\/a><br \/>\n(ou Emby), les s\u00e9rialise et les envoie ensuite via TCP (port 5050) vers un serveur qui lui dispose d&#8217;un bon GPU. Et c\u00f4t\u00e9 Jellyfin, rien ne change puisque le binaire r\u00e9pond exactement comme ffmpeg le ferait (et je vous rassure, y&#8217;a un peu d&#8217;authentification pour \u00e9viter de vous faire squatter votre serveur de transcoding \u00e0 l&#8217;insu de votre plein gr\u00e9).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/ffmpeg-over-ip-le-transcodage-gpu-distant-pour-jellyfin\/ffmpeg-over-ip-le-transcodage-gpu-distant-pour-jellyfin-2.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>Alors imaginons un peu dans quelle situation \u00e7a peut \u00eatre utile&#8230; Par exemple, vous pourriez avoir un NUC ou mini-PC tout neuf qui fait tourner Jellyfin dans Docker, et \u00e0 c\u00f4t\u00e9 une vieille tour avec une GTX qui tra\u00eene dans un coin pour le transcodage. L&#8217;avantage c&#8217;est que plusieurs clients peuvent ainsi partager le m\u00eame serveur GPU en parall\u00e8le, donc ffmpeg-over-ip peut valoir le coup si vous avez du mat\u00e9riel qui dort dans un coin.<\/p>\n<p>L&#8217;outil est sign\u00e9 Anees Iqbal (steelbrain) et voici comment l&#8217;installer (pensez \u00e0 v\u00e9rifier le contenu du .sh avant) :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">curl -fsSL https:\/\/ffmpeg-over-ip.com\/install-client.sh | sh\n<\/span><\/span><\/code><\/pre>\n<p>Windows a aussi droit \u00e0 son \u00e9quivalent PowerShell si vous voulez.<\/p>\n<p>Pour brancher \u00e7a sur<br \/>\n<a href=\"https:\/\/korben.info\/jellyfin-le-media-center-libre.html\">Jellyfin<\/a><br \/>\nensuite, c&#8217;est direction Dashboard \u2192 Playback \u2192 chemin ffmpeg \u2192 et faites pointer vers <code>ffmpeg-over-ip-client<\/code>. Notez que ffprobe doit aussi \u00eatre redirig\u00e9 car Jellyfin l&#8217;appelle s\u00e9par\u00e9ment pour les m\u00e9tadonn\u00e9es. Vous pouvez faire un lien symbolique pour \u00eatre tranquille :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">ln -s ffmpeg-over-ip-client ffprobe\n<\/span><\/span><\/code><\/pre>\n<p>Et ensuite, pour v\u00e9rifier, cette commande : <code>.\/ffmpeg-over-ip-client -version<\/code> devrait vous retourner les infos de l&#8217;instance ffmpeg distante. Si \u00e7a r\u00e9pond, c&#8217;est que c&#8217;est bon !<\/p>\n<p>Notez que la config permet de passer par des variables d&#8217;environnement du genre <code>FFMPEG_OVER_IP_CLIENT_ADDRESS<\/code> pour l&#8217;adresse du serveur, <code>FFMPEG_OVER_IP_CLIENT_AUTH_SECRET<\/code> pour la cl\u00e9 HMAC. Et pour tout ce qui est param\u00e8tres avanc\u00e9s, disons que les remappings de filtres complexes qu&#8217;on peut faire avec ffmpeg n\u00e9cessitent encore un fichier <code>.jsonc<\/code> \u00e0 cr\u00e9er et param\u00e9trer.<\/p>\n<p>C\u00f4t\u00e9 serveur, les acc\u00e9l\u00e9rations support\u00e9es sont : NVENC (NVIDIA), QSV (Intel), VAAPI (Linux), AMF (AMD), VideoToolbox (macOS). Et comme c&#8217;est bas\u00e9 sur jellyfin-ffmpeg, du coup y&#8217;a toutes les acc\u00e9l\u00e9rations habituelles sans avoir \u00e0 recompiler.<\/p>\n<p>Par contre, attention si le serveur GPU tombe, y&#8217;aura aucun fallback automatique vers le CPU local. Et si votre r\u00e9seau interne est en 100Mbps et que vous transcodez du 4K HEVC, le goulot d&#8217;\u00e9tranglement sera le transit r\u00e9seau, pas le GPU. Donc optez pour un r\u00e9seau en gigabit minimum dans ce cas.<\/p>\n<p>Bref, c&#8217;est simple, propre, et tr\u00e8s bien pens\u00e9 par exemple pour les setups Docker qui n&#8217;ont pas d&#8217;acc\u00e8s direct au mat\u00e9riel.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Jellyfin sans GPU, c&#8217;est la croix et la banni\u00e8re d\u00e8s que quelqu&#8217;un lance un film en 4K. Mais c&#8217;\u00e9tait sans compter sur ffmpeg-over-ip qui est capable de transformer un serveur \u00e9quip\u00e9 d&#8217;un GPU en endpoint de transcoding distant, accessible via un simple binaire qui se fait passer pour ffmpeg. Y&#8217;a pas de passthrough GPU, ni besoin de vous lancer dans la config de point de montage r\u00e9seau exotique. Le principe c&#8217;est que le client re\u00e7oit les commandes ffmpeg de Jellyfin (ou Emby), les s\u00e9rialise et les envoie ensuite via TCP (port 5050) vers un serveur qui lui dispose d&#8217;un bon GPU. Et c\u00f4t\u00e9 Jellyfin, rien ne change puisque le binaire r\u00e9pond exactement comme ffmpeg le ferait (et je vous rassure, y&#8217;a un peu d&#8217;authentification pour \u00e9viter de vous faire squatter votre serveur de transcoding \u00e0 l&#8217;insu de votre plein gr\u00e9). Alors imaginons un peu dans quelle situation \u00e7a peut \u00eatre utile&#8230; Par exemple, vous pourriez avoir un NUC ou mini-PC tout neuf qui fait tourner Jellyfin dans Docker, et \u00e0 c\u00f4t\u00e9 une vieille tour avec une GTX qui tra\u00eene dans un coin pour le transcodage. L&#8217;avantage c&#8217;est que plusieurs clients peuvent ainsi partager le m\u00eame serveur GPU en parall\u00e8le, donc ffmpeg-over-ip peut valoir le coup si vous avez du mat\u00e9riel qui dort dans un coin. L&#8217;outil est sign\u00e9 Anees Iqbal (steelbrain) et voici comment l&#8217;installer (pensez \u00e0 v\u00e9rifier le contenu du .sh avant) : curl -fsSL https:\/\/ffmpeg-over-ip.com\/install-client.sh | sh Windows a aussi droit \u00e0 son \u00e9quivalent PowerShell si vous voulez. Pour brancher \u00e7a sur Jellyfin ensuite, c&#8217;est direction Dashboard \u2192 Playback \u2192 chemin ffmpeg \u2192 et faites pointer vers ffmpeg-over-ip-client. Notez que ffprobe doit aussi \u00eatre redirig\u00e9 car Jellyfin l&#8217;appelle s\u00e9par\u00e9ment pour les m\u00e9tadonn\u00e9es. Vous pouvez faire un lien symbolique pour \u00eatre tranquille : ln -s ffmpeg-over-ip-client ffprobe Et ensuite, pour v\u00e9rifier, cette commande : .\/ffmpeg-over-ip-client -version devrait vous retourner les infos de l&#8217;instance ffmpeg distante. Si \u00e7a r\u00e9pond, c&#8217;est que c&#8217;est bon ! Notez que la config permet de passer par des variables d&#8217;environnement du genre FFMPEG_OVER_IP_CLIENT_ADDRESS pour l&#8217;adresse du serveur, FFMPEG_OVER_IP_CLIENT_AUTH_SECRET pour la cl\u00e9 HMAC. Et pour tout ce qui est param\u00e8tres avanc\u00e9s, disons que les remappings de filtres complexes qu&#8217;on peut faire avec ffmpeg n\u00e9cessitent encore un fichier .jsonc \u00e0 cr\u00e9er et param\u00e9trer. C\u00f4t\u00e9 serveur, les acc\u00e9l\u00e9rations support\u00e9es sont : NVENC (NVIDIA), QSV (Intel), VAAPI (Linux), AMF (AMD), VideoToolbox (macOS). Et comme c&#8217;est bas\u00e9 sur jellyfin-ffmpeg, du coup y&#8217;a toutes les acc\u00e9l\u00e9rations habituelles sans avoir \u00e0 recompiler. Par contre, attention si le serveur GPU tombe, y&#8217;aura aucun fallback automatique vers le CPU local. Et si votre r\u00e9seau interne est en 100Mbps et que vous transcodez du 4K HEVC, le goulot d&#8217;\u00e9tranglement sera le transit r\u00e9seau, pas le GPU. Donc optez pour un r\u00e9seau en gigabit minimum dans ce cas. Bref, c&#8217;est simple, propre, et tr\u00e8s bien pens\u00e9 par exemple pour les setups Docker qui n&#8217;ont pas d&#8217;acc\u00e8s direct au mat\u00e9riel.<\/p>\n","protected":false},"author":1,"featured_media":2910,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2909","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2909"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2909\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2910"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}