--- title: Jellyfin Транскод на RPi5 — PGS/Subtitle Pitfalls type: reference namespace: work tags: - jellyfin - kraken - transcode - subtitles - pitfalls created: '2026-05-18' updated: '2026-09-04' --- # Jellyfin Транскод на RPi5 — PGS/Subtitle Pitfalls ## Контекст Клиент: Konka TV с WebOS. Сервер: Raspberry Pi 5 (Крaken, ARM64). ## Direct Play условия Direct Play работает при выполнении всех условий: - Аудио: AAC - Субтитры: **отсутствуют** (или внешние SRT, без burn-in) ## Проблема PGS/ASS субтитров PGS и ASS (SSA) субтитры вызывают **burn-in** — Jellyfin рендерит субтитры прямо в видеопоток. **Результат:** полный транскод на CPU → **275% CPU load** на RPi5 → лаги, перегрев. **Экспериментальный PGS rendering** в настройках Jellyfin — **не помогает** на RPi5. ## Решение: конвертация PGS → SRT Установка через uv (arm64/aarch64 совместимо): ```bash ~/.local/bin/uv tool install pgsrip sudo apt-get install -y libgl1 libglib2.0-0 tesseract-ocr tesseract-ocr-rus tesseract-ocr-eng ``` Скрипт конвертации: ``` /srv/dev-disk-by-uuid.../docker/media-pipeline/pgs-to-srt.sh ``` ```bash # один файл pgs-to-srt.sh /media/movies/Film.mkv # вся директория pgs-to-srt.sh /media ``` Логи: `/srv/.../docker/media-pipeline/pgs-to-srt.log` Скрипт: - Скипает файлы без PGS-дорожек (S_HDMV) - Скипает если .srt уже есть рядом - Пишет лог с timestamp После конвертации Jellyfin читает внешние `.srt` без транскода. ## Transmission completion hook Хук `/config/on-download-complete.sh` (монтируется в контейнер `:ro`) после завершения загрузки: 1. Запускает media-pipeline sync 2. Запускает pgs-to-srt.sh для скачанного файла/директории Лог: `/srv/.../docker/media-pipeline/download-complete.log` ## Итог по субтитрам | Тип | Direct Play | Транскод | |-----|------------|---------| | Нет субтитров | ✅ | — | | Внешний SRT | ✅ | — | | ASS/SSA | ❌ | burn-in, 275% CPU | | PGS (MKS/MKV) | ❌ | burn-in, 275% CPU | ## NFD/NFC filename encoding pitfall **Проблема:** HTPC сохраняет имена файлов в NFD, Kraken — в NFC. → Jellyfin видит **две** папки: одна с `.avi` файлом (NFD), другая с `.nfo` (NFC). → NFO не применяется — Jellyfin берёт NFD-папку (с видео) и игнорирует NFC-папку (с NFO). → Метаданные пустые. **Фикс A (быстрый):** скопировать `movie.nfo` + `poster.jpg` в NFD-папку: ```bash # python3 — использовать bytes для путей import os, shutil nfc_path = "…/Movie.NFC/movie.nfo" nfd_path = "…/Movie.NFD/movie.nfo" shutil.copy(nfc_path.encode(), nfd_path.encode()) ``` **Фикс B (радикальный):** переименовать всё в NFC (нормализовать). **Диагностика:** ```bash ls -la | cat -v # покажет NFD-escape символы как ^ escape sequences python3 -c "import os; [print(repr(f)) for f in os.listdir('.')]" ``` ## 2026-09-04: 4K при чистых Direct Play подтормаживал по Wi-Fi — РЕШЕНО переводом ТВ на провод **Наблюдение (важно для диагностики стриминговых тормозов):** сервер/диск могут быть «невиноваты», даже если клиент (Jellyfin for WebOS) дёргает картинку. Нужно проверить не только MAC-счётчики Wi-Fi (они могут быть «чистыми»), но и попробовать провод. Симптомы на Kraken + LG webOS TV: - И тяжёлый `Неистовый (2020)` Remux-2160p (~89 Мбит/с), и лёгкий `Project Hail Mary (2026)` WEB-DL 4K (~25 Мбит/с, HEVC Main10 HDR10+) подтормаживали при чистых Direct Play **по Wi-Fi**. - При воспроизведении: `0 ffmpeg`-процессов, транскода нет, CPU Kraken `load 0.1`, сервер отдавал лишь `~21 Мбит/с`, Wi-Fi ТВ был «чист» по MAC-счётчикам (`0 CRC`, `0 retries`, `-53 dBm`) — т.е. локально сервер И клиентские линки выглядели здоровыми. - ⚠️ **Ловушка:** чистые MAC-счётчики не исключают джиттер/переупорядочивание пакетов на Wi-Fi в зашумлённом эфире — это и был реальный источник микрозазоров. **Разрешение (2026-09-04):** (1) eth0 Kraken возвращён на 1G (замена патч-корда) + (2) **ТВ переведён на проводной Ethernet** (на тот момент линк 100M downshift). После этого и remux-4K (~89 Мбит/с), и лёгкий WEB-4K **идут без тормозов**. → Причина — нестабильный Wi-Fi последней мили ТВ, не пропускная способность и не декодер клиента. Стратегия качества (профиль `WEB-4K (no remux)` в Radarr/Sonarr, benchmark размеров): см. `[[how-to/arr-stack-kraken]]` → «Качество загрузки». ## Связанные страницы - [[concepts/kraken-media-stack]] — полный медиастек: *arr + Jellyfin + media-pipeline - [[tech/kraken-network]] — инфра Кракена, HDD error recovery