Jellyfin hardware transcoding у Docker на Intel Quick Sync зводиться до трьох речей: хост бачить iGPU, контейнер отримує доступ до /dev/dri, а в самому Jellyfin увімкнено апаратне кодування через VAAPI або QSV. Якщо один шар випадає, сервер або піде в software transcoding, або взагалі зламає відтворення.
У практичному сценарії для homelab це дає менше навантаження на CPU, тихіший сервер і нормальну роботу кількох потоків, коли клієнти не підтримують оригінальний кодек чи бітрейт. Нижче – робоча схема для Linux-хоста з Docker Compose, перевірка результату і місця, де все зазвичай сиплеться.
Що має працювати на хості до запуску контейнера
До старту Jellyfin хостова система повинна віддавати Intel GPU через /dev/dri. Якщо каталогу або вузлів пристроїв немає, у контейнер передавати нічого. Тоді Jellyfin hardware transcoding не запуститься незалежно від налаштувань у веб-інтерфейсі.
Перевірка проста:
ls -l /dev/dri lspci | grep -i vga uname -a
На Intel зазвичай потрібен робочий DRM-стек у ядрі Linux. Для більшості дистрибутивів цього достатньо з коробки, але в мінімальних серверних збірках часто бракує користувацьких бібліотек для VAAPI. Саме тут багато хто даремно шукає проблему в Docker, хоча контейнер лише успадковує стан хоста.
Ще один практичний момент: якщо на хості вже крутиться Plex, Frigate або інший контейнер, що активно використовує той самий iGPU, Quick Sync не ламається автоматично, але під навантаженням починається конкуренція за відеодвигун. Для одного-двох паралельних стрімів це терпимо. Далі краще дивитися на реальну телеметрію, а не на сам факт наявності iGPU.
Docker Compose з доступом до /dev/dri
У контейнер треба передати пристрій /dev/dri і не зламати права доступу. Найпростіше – пробросити вузол пристрою та додати контейнер до групи, яка має доступ до рендер-пристрою. Без цього Jellyfin бачить опцію апаратного транскодування, але реально не може відкрити пристрій.
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
network_mode: bridge
ports:
- "8096:8096"
volumes:
- ./config:/config
- ./cache:/cache
- /srv/media:/media:ro
devices:
- /dev/dri:/dev/dri
group_add:
- "44"
- "109"
restart: unless-stopped
Числа в group_add – не універсальні. На одному хості render матиме один GID, на іншому інший. Їх треба звіряти локально:
getent group render getent group video ls -l /dev/dri
Якщо контейнер запускається не від root, права стають ще важливішими. У такій схемі краще спочатку добитися доступу до /dev/dri, а вже потім закручувати гайки через PUID, PGID або кастомного користувача. Інакше діагностика перетворюється на полювання на два різні класи помилок одразу.
Де вмикається Jellyfin hardware transcoding
Після старту контейнера Jellyfin hardware transcoding вмикається вже у веб-інтерфейсі сервера. Потрібно перейти в налаштування відтворення і вибрати Intel-сумісний метод апаратного прискорення. На Linux найчастіше це VAAPI; залежно від збірки та середовища може бути доступний і QSV.
Практичне правило просте: якщо контейнер стабільно бачить /dev/dri/renderD*, починати варто з VAAPI. QSV інколи працює не гірше, але в Docker-сценаріях додатковий шар абстракції рідко щось спрощує. У homelab VAAPI зазвичай дає коротший шлях до робочого результату.
Увімкнути потрібно не все підряд, а лише ті кодеки й операції, які реально підтримує хостовий iGPU. Надмірно агресивний набір галочок часто призводить до дивних падінь на окремих файлах: один H.264 потік іде нормально, наступний HEVC з субтитрами – вже ні. Коли потрібна стабільність, краще почати з базового набору, потім розширювати.
Як перевірити, що Intel Quick Sync справді працює
Ознака коректної роботи – під час відтворення сервер не забиває CPU, а в логах і на рівні процесів видно використання GPU-шляху. Перевіряти краще на файлі, який точно змусить сервер транскодувати відео, а не робити direct play.
- Запустити відтворення файлу з клієнта, який не підтримує початковий формат або обмежений бітрейтом.
- Відкрити dashboard Jellyfin і перевірити, що потік позначено як transcoding.
- На хості подивитися завантаження CPU і GPU.
docker logs -f jellyfin top intel_gpu_top
Якщо intel_gpu_top показує активність відеодвигуна, а CPU не впирається в стелю, Jellyfin hardware transcoding працює як треба. Коли CPU росте, а GPU мовчить, сервер або впав у software transcoding, або зламався на проміжному етапі – наприклад, декодить апаратно, але кодує вже процесором.
Окремо варто перевірити сценарій із субтитрами. Саме тут багато акуратних конфігів раптом втрачають сенс: burn-in субтитрів часто тягне зайву обробку, і частина навантаження повертається на CPU. Для компактного homelab-сервера це різниця між одним стабільним потоком і кількома.
Чому /dev/dri є, але транскодування не працює
Наявність /dev/dri в контейнері ще не гарантує успіху. Типові проблеми – неправильні права, відсутні бібліотеки VAAPI в образі, конфлікт між користувачем контейнера і групою render, або невідповідний метод прискорення в налаштуваннях самого Jellyfin.
Проблема з правами доступу
Найчастіший сценарій: контейнер бачить вузли пристроїв, але не може їх відкрити.
docker exec -it jellyfin sh ls -l /dev/dri id
Якщо користувач усередині контейнера не входить у групу з доступом до renderD*, Jellyfin hardware transcoding не підніметься.
Проблема не в Docker, а в хості
Коли драйверний стек на хості поламаний, контейнер це не виправить. Особливо часто таке буває після оновлень ядра, міграції на нову платформу або при спробі запускати сервер у віртуалці без коректного passthrough iGPU.
Невдалий профіль транскодування
Не всі формати однаково добре проходять через Intel Quick Sync. Додаються субтитри, HDR-to-SDR tone mapping, нестандартний контейнер – і сервер раптом переключається на змішаний режим. Формально апаратне прискорення увімкнене, фактично виграш мінімальний.
Де межа цього підходу в homelab
Для домашнього медіасервера Intel Quick Sync у Docker закриває типовий сценарій дуже добре: кілька клієнтів, різні профілі відтворення, мінімум ручного тюнінгу. Але це рішення не безмежне. Коли бібліотека важка, клієнти постійно тягнуть 4K, а частина потоку йде з burn-in субтитрів, вузьким місцем стає вже не Docker, а сам iGPU.
Тут корисно дивитися не на рекламну обіцянку апаратного кодування, а на реальний профіль медіатеки. Якщо більшість клієнтів підтримує direct play, Jellyfin hardware transcoding потрібен радше як страховка. Якщо ж сервер постійно змінює кодек, бітрейт і контейнер, тоді вибір CPU та покоління Intel graphics починає важити більше, ніж акуратність compose-файлу.
У невеликому homelab цей підхід виправданий. Для більш агресивного сценарію іноді простіше зменшити кількість транскодувань на рівні бібліотеки, ніж нескінченно тюнити контейнер.
Офіційні сторінки
Для звірки налаштувань і актуальної поведінки сервера варто тримати під рукою офіційний сайт Jellyfin і репозиторій контейнерних образів jellyfin/jellyfin.
Коментарі
Коментарів ще немає. Обговорення - у Telegram.