{"id":530,"date":"2026-10-06T09:15:00","date_gmt":"2026-10-06T07:15:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?page_id=530"},"modified":"2026-09-25T15:07:52","modified_gmt":"2026-09-25T13:07:52","slug":"zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/","title":{"rendered":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration"},"content":{"rendered":"<h2>Architectural Overview: Media Transcoding on the Raspberry Pi 5<\/h2>\n<p>Hosting a self-managed video streaming server on a Raspberry Pi traditionally faced severe performance bottlenecks when client devices required real-time transcoding. Unsupported codecs, incompatible audio streams, or bandwidth restrictions force the media server to decode and re-encode video frames on the fly. On general-purpose ARM processor cores, software-based transcoding of high-bitrate HEVC (H.265) or 4K media rapidly exhausts CPU resources, leading to thermal throttling and playback stuttering.<\/p>\n<p>The Raspberry Pi 5 (powered by the Broadcom BCM2712 SoC) decodes only HEVC in hardware, and that decoder is stateless: it is driven through the V4L2 request API, not through stateful V4L2-M2M decoders such as <code>hevc_v4l2m2m<\/code>. <strong>Jellyfin<\/strong> does not use it: its \u201cVideo4Linux2\u201d option only employs V4L2 encoders such as <code>h264_v4l2m2m<\/code>, and the Pi 5 has no encoder; the project has also deprecated V4L2 support for the Raspberry Pi. Run as a container on the Pi 5, Jellyfin therefore decodes and encodes in software on the four ARM Cortex-A76 cores; low power consumption applies to Direct Play, not to transcoding.<\/p>\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/hand-jellyfin-en.png?v=20260925\" width=\"1120\" height=\"700\" alt=\"Three-layer diagram from client through the Jellyfin container to the Raspberry Pi host, with the settings that have to cross each boundary\"><figcaption>On the Pi 5, Jellyfin transcodes in software: V4L2 is deprecated for the Pi, hardware acceleration is set to \u201cNone\u201d, and Jellyfin does not use the stateless HEVC decoder \u2014 only direct play stays fast and frugal.<\/figcaption><\/figure>\n<h2>Step-by-Step Implementation Guide<\/h2>\n<h3>Step 1: Host Operating System Preparation and DRM Device Verification<\/h3>\n<p>A 64-bit Raspberry Pi OS Lite installation is required to ensure compatibility with 64-bit FFmpeg hardware libraries; current images have been based on Debian 13 (Trixie) since October 2025, with Debian 12 (Bookworm) as the minimum version. Before initializing container runtimes, the presence of Direct Rendering Manager (DRM) devices must be verified via terminal:<\/p>\n<pre><code>ls -l \/dev\/dri<\/code><\/pre>\n<p>A healthy system output displays the card and render nodes (<code>card0<\/code>, <code>card1<\/code>, <code>renderD128<\/code>). To allow Docker containers access to these graphics nodes, the executing service group permissions must be confirmed:<\/p>\n<pre><code>sudo usermod -aG video,render \"$USER\"<\/code><\/pre>\n<h3>Step 2: Persistent NVMe Storage Architecture and Directory Layout<\/h3>\n<p>For zero-latency library scanning and smooth high-bitrate streaming, media archives should reside on an NVMe SSD connected via the PCIe 2.0\/3.0 interface or a UASP-compatible USB 3.0 storage array. A clean directory hierarchy is created under <code>\/opt\/containers\/jellyfin\/<\/code>:<\/p>\n<pre><code>mkdir -p \/opt\/containers\/jellyfin\/{config,cache}\nmkdir -p \/mnt\/media\/{movies,series}\nchmod -R 755 \/mnt\/media<\/code><\/pre>\n<h3>Step 3: Designing the Declarative Docker Compose Stack<\/h3>\n<p>The container orchestration is defined inside <code>\/opt\/containers\/jellyfin\/docker-compose.yml<\/code>. The host&#8217;s <code>\/dev\/dri<\/code> directory, which hardware-accelerated transcoding would need, is mapped into the container, on the Pi 5 only as a precaution (see Step 4), and the container process must run under a fixed user ID set via <code>user<\/code> while additionally joining the host&#8217;s <code>render<\/code> and <code>video<\/code> groups by their numerical GIDs via <code>group_add<\/code>:<\/p>\n<pre><code>services:\n  jellyfin:\n    image: jellyfin\/jellyfin:latest\n    container_name: jellyfin\n    restart: unless-stopped\n    user: \"1000:1000\"\n    group_add:\n      - \"44\"  # Replace with the host numerical GID of 'video'\n      - \"109\" # Replace with the host numerical GID of 'render'\n    network_mode: \"host\"\n    environment:\n      - JELLYFIN_PublishedServerUrl=http:\/\/jellyfin.lukaswojcik.com\n    volumes:\n      - \"\/opt\/containers\/jellyfin\/config:\/config\"\n      - \"\/opt\/containers\/jellyfin\/cache:\/cache\"\n      - \"\/mnt\/media:\/media:ro\"\n    devices:\n      - \"\/dev\/dri:\/dev\/dri\"\n    security_opt:\n      - no-new-privileges:true<\/code><\/pre>\n<p><em>Technical Note:<\/em> Using <code>network_mode: \"host\"<\/code> maximizes network throughput and enables automatic DLNA\/UPnP local network discovery without complex bridge port-forwarding rules.<\/p>\n<h3>Step 4: Transcoding Settings in the Jellyfin Dashboard<\/h3>\n<p>After launching the stack via <code>docker compose up -d<\/code>, transcoding is set up within the Jellyfin administrative interface:<\/p>\n<ol>\n<li>Access the web interface at <code>http:\/\/&lt;Raspberry-Pi-IP&gt;:8096<\/code> and navigate to <strong>Dashboard &rarr; Playback &rarr; Transcoding<\/strong>.<\/li>\n<li>In the <strong>Hardware acceleration<\/strong> dropdown menu, the setting stays at <strong>None<\/strong>. <strong>Video4Linux2 (V4L2)<\/strong> does nothing on the Pi 5: Jellyfin only uses V4L2 encoders through it, the BCM2712 has no video encoder at all, and the Jellyfin documentation lists V4L2 for the Raspberry Pi as deprecated. An OpenMAX\/OMX entry no longer exists: Jellyfin has removed it, and Raspberry Pi OS dropped the OMX interface with Bullseye.<\/li>\n<li>There are therefore no hardware decoding boxes to check. Jellyfin does not address the SoC&#8217;s only hardware decoder, the one for <strong>HEVC<\/strong>, and the BCM2712 no longer contains the H.264, MPEG-2 and MPEG-4 decoder blocks of the Raspberry Pi 4; all formats are decoded in software on the Cortex-A76 cores.<\/li>\n<li>Set the <strong>FFmpeg path<\/strong> to <code>\/usr\/lib\/jellyfin-ffmpeg\/ffmpeg<\/code> and save the configuration.<\/li>\n<\/ol>\n<h3>Step 5: Quality Assurance and Real-Time Transcoding Verification<\/h3>\n<p>How heavily transcoding loads the CPU, and whether Jellyfin re-encodes at all, is shown by a check during an active video stream:<\/p>\n<ol>\n<li><strong>Initiate a Transcoded Stream:<\/strong> Play an HEVC (H.265) 10-bit video file on a web browser client that lacks native H.265 support, forcing Jellyfin to transcode to H.264. Both decoding and encoding run in software here: Jellyfin does not use the Pi 5&#8217;s HEVC decoder, and the BCM2712 contains no video encoder at all, so the H.264 encoding is performed by libx264 on the CPU.<\/li>\n<li><strong>Inspect FFmpeg Process Architecture:<\/strong> In an SSH terminal on the Raspberry Pi, run <code>htop<\/code> or <code>top<\/code>. Because decoding and encoding stay in software, heavy load across all four cores is expected in this scenario and does not indicate a broken setup. Low CPU figures only appear when no re-encoding takes place, that is during Direct Play. Whether the HEVC decoder itself works is only shown by a decode-only test outside Jellyfin with the FFmpeg from Raspberry Pi OS on the host, such as <code>ffmpeg -hwaccel drm -i file.mkv -f null -<\/code>.<\/li>\n<li><strong>Audit Transcoder Logs:<\/strong> Check the generated logs under <code>\/opt\/containers\/jellyfin\/config\/log\/ffmpeg-transcode-*.txt<\/code>. A decoder such as <code>hevc_v4l2m2m<\/code> does not appear there, because Jellyfin sets no decoder for V4L2. The telling entry is the one after <code>-codec:v:0<\/code>: <code>libx264<\/code> means the picture is re-encoded, <code>copy<\/code> means it is only repackaged.<\/li>\n<\/ol>\n<h2>Summary and Measurable Added Value<\/h2>\n<p><strong>What is achieved:<\/strong> Deployment of a containerized, self-hosted Jellyfin media server on a Raspberry Pi 5 that serves video files via Direct Play and transcodes in software when needed.<\/p>\n<p><strong>Resulting added value:<\/strong><\/p>\n<ul>\n<li><strong>Stutter-Free Local Media Streaming:<\/strong> High-bitrate archives (including HEVC\/H.265 files) play instantaneously via Direct Play on client devices that support their codec, without buffering or playback delays.<\/li>\n<li><strong>Low Energy Consumption:<\/strong> During Direct Play the server delivers the file without decoding it, so power consumption stays low, allowing 24\/7 silent operation; transcoding with libx264, by contrast, loads all four cores and calls for active cooling.<\/li>\n<li><strong>Complete Data Privacy and Cost Independence:<\/strong> Local video collections remain entirely on-premise without cloud dependencies, external telemetry, or subscription fees.<\/li>\n<\/ul>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Why does Jellyfin transcode even though the client device can play HEVC?<\/h3>\n<p>Because the server checks more than the video codec. Re-encoding the picture also becomes necessary when another part of the file does not suit the client, and on the Raspberry Pi 5 every such encode runs in software. Common triggers are:<\/p>\n<ol>\n<li>Subtitles in image formats such as PGS that the client cannot render itself. They are burned into the picture, and that requires the video to be re-encoded. Text subtitles such as SRT, by contrast, can usually be delivered separately.<\/li>\n<li>A bitrate limit in the player that is lower than the bitrate of the file. The server then transcodes down to a lower bitrate even though the codec fits.<\/li>\n<li>An audio track the client does not support. Here converting only the audio is often enough, which puts far less load on the CPU than re-encoding the picture.<\/li>\n<\/ol>\n<p>The logs under \/config\/log that the article uses for verification show which case applies: if the video is listed as copy instead of libx264, the file is only being repackaged or its audio converted. Removing the causes, for example with text subtitles or a higher bitrate limit in the player, leads to Direct Play and thus to the low CPU figures the article gives for that case.<\/p>\n<h3>Why does group_add list numbers instead of the group names video and render?<\/h3>\n<p>The kernel checks access to \/dev\/dri by numeric group ID, and the names video and render are tied to those numbers only on the host system; in the container image they may be missing or carry different numbers. The right values come from getent group video render on the host. The usermod from Step 1, on the other hand, only affects the user on the host, not the process inside the container.<\/p>\n<h3>Does the Raspberry Pi 5 need active cooling for this setup?<\/h3>\n<p>As soon as it transcodes, yes. Because the BCM2712 has no video encoder, libx264 keeps all four cores busy during every transcode, for the entire length of a movie. Without active cooling, the SoC reaches the temperature at which the firmware lowers the clock speed, and exactly this thermal throttling causes the stuttering the article describes for software transcoding.<\/p>\n<p>Whether throttling has already occurred is shown by vcgencmd get_throttled on the host: a value of 0x0 means that neither undervoltage nor throttling has occurred since boot. Setups that mostly rely on Direct Play usually get by with passive cooling, because nothing then has to be decoded or encoded.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/jellyfin.org\/docs\/\" target=\"_blank\" rel=\"noopener noreferrer\">Jellyfin documentation<\/a><\/li>\n<li><a href=\"https:\/\/jellyfin.org\/docs\/general\/post-install\/transcoding\/hardware-acceleration\/\" target=\"_blank\" rel=\"noopener noreferrer\">Jellyfin: Hardware Acceleration<\/a><\/li>\n<li><a href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/raspberry-pi.html\" target=\"_blank\" rel=\"noopener noreferrer\">Raspberry Pi hardware documentation<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Technical tutorial on deploying a self-hosted Jellyfin media server on Raspberry Pi 5 using V4L2 hardware acceleration for real-time transcoding at minimal power consumption.<\/p>\n","protected":false},"author":1,"featured_media":14082,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92630],"tags":[91113,91064,91181,91237,91219],"class_list":["post-530","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-raspberry-pi","tag-homelab","tag-linux","tag-raspberry-pi","tag-self-hosting","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration | Lukas Wojcik<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Technical tutorial on deploying a self-hosted Jellyfin media server on Raspberry Pi 5 using V4L2 hardware acceleration for real-time transcoding at minimal power consumption.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-06T07:15:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-530-zero-latency-local-media-server-jell-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration\",\"datePublished\":\"2026-10-06T07:15:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/\"},\"wordCount\":1368,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-530-zero-latency-local-media-server-jell-g.png\",\"keywords\":[\"Homelab\",\"Linux\",\"Raspberry Pi\",\"Self-Hosting\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/\",\"name\":\"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-530-zero-latency-local-media-server-jell-g.png\",\"datePublished\":\"2026-10-06T07:15:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-530-zero-latency-local-media-server-jell-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-530-zero-latency-local-media-server-jell-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration | Lukas Wojcik","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/","og_locale":"en_US","og_type":"article","og_title":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration | Lukas Wojcik","og_description":"Technical tutorial on deploying a self-hosted Jellyfin media server on Raspberry Pi 5 using V4L2 hardware acceleration for real-time transcoding at minimal power consumption.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-06T07:15:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-530-zero-latency-local-media-server-jell-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration","datePublished":"2026-10-06T07:15:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/"},"wordCount":1368,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-530-zero-latency-local-media-server-jell-g.png","keywords":["Homelab","Linux","Raspberry Pi","Self-Hosting","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/","name":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-530-zero-latency-local-media-server-jell-g.png","datePublished":"2026-10-06T07:15:00+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-530-zero-latency-local-media-server-jell-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-530-zero-latency-local-media-server-jell-g.png","width":1200,"height":630,"caption":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/zero-latency-local-media-server-jellyfin-on-raspberry-pi-5-with-hardware\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Zero-Latency Local Media Server: Jellyfin on Raspberry Pi 5 with Hardware Acceleration"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=530"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/530\/revisions"}],"predecessor-version":[{"id":21621,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/530\/revisions\/21621"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/14082"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}