13 KiB
Executable File
title, created, updated, type, namespace, status, tags, related
| title | created | updated | type | namespace | status | tags | related | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Многопоточный стриминг и обход single-flow лимита (Jellyfin / webOS / TorrServer) | 2026-09-21 | 2026-09-22 | research | personal | research-complete |
|
|
Многопоточный стриминг — что реально существует
Контекст: Jellyfin на TrueNAS (Новосибирск) тормозит при просмотре из Бишкека. Speedtest через reverse-туннель показывает до 120 Мбит/с, но видео дёргается. Разбор: почему, и какие пути обхода существуют. Дата: 2026-09-21.
1. Почему speedtest 120 Мбит, а видео тормозит
Speedtest открывает 8+ параллельных TCP-сессий. Каждая независимо разгоняется своим congestion window. 8 сессий × ~15 Мбит = 120 Мбит. Это доказывает, что канал физически пропускает 120 Мбит.
Но одна TCP-сессия не берёт 120 Мбит. Скорость ≈ окно / RTT. При RTT ~104 мс для 120 Мбит нужно окно ≈ 1.5 МБ «в полёте», не подтверждённых. Одна сессия разгоняется не сразу, при потерях окно режется вдвое, на межоператорском стыке потери почти всегда есть.
Замеры межсайтовой пропускной способности (2026-09-02):
| Режим | Пропускная способность |
|---|---|
| Mac → TrueNAS, 1 SCP-поток | ~28 Мбит/с |
| Mac → TrueNAS, 4 параллельных | ~51 Мбит/с (×1.8) |
| Speedtest (8 потоков) | до 120 Мбит/с |
Рост ×1.8 при 4 потоках доказывает: ограничение — не полоса транзита, а один TCP-поток при высоком RTT.
Аналогия (уточнена Alex): не «узкая труба», а 8 касс, где канал пропустит 120 чел/мин — если открыты все 8. Один покупатель с одной корзиной в одной кассе уедет не быстрее этой кассы. Узкое — не канал, а одно соединение на длинном пути.
2. Почему туннели не помогают
Замеры 2026-09-02 через xray-test-client:
| Режим | Egress | Down | Стабильность |
|---|---|---|---|
kraken-user (reverse) |
92.62.70.41 (Kraken) |
~45 Мбит | 2.0–6.98 МБ/с (разброс замеров) |
user1 (direct/REALITY) |
90.189.160.148 (TrueNAS) |
~37 Мбит | 3.67–5.63 МБ/с |
| Контроль (Mac → Cloudflare напрямую) | — | ~55 МБ/с | — |
VLESS/REALITY идёт через тот же маршрут ТТК → Ростелеком (хоп 8, +50 мс). Меняется инкапсуляция, не физика. REALITY/Vision добавляет обёртки → обычно чуть хуже прямого, не лучше.
🔴 Несколько xray-туннелей НЕ дадут скорости
Это MPTCP/bonding — он агрегирует разные физические пути. Путь один. N туннелей по одному пути разделят тот же congestion window — суммарно не больше одного, плюс оверхед. Подтверждено замерами: reverse 45 и direct 37 — один коридор, не ×2.
Реальная агрегация требует второго независимого линка (мобильный 4G/5G как backup-WAN).
3. Многопоточный HLS — существует, но не реализован
| Решение | Статус |
|---|---|
| Jellyfin feature request «multiple parallel connections» | ✅ Planned, 230 голосов (features.jellyfin.org/posts/2171). Issue #3206 (2020) закрыт как stale. 5 лет, кода нет |
| hls.js issue #6753 (multi-segment prefetch) | Открыт Oct 2024, milestone 1.8.0, «Top priorities». Кода нет, PR отсутствует |
| ExoPlayer #5978 (parallelize DASH/HLS) | Android, не webOS |
Механизм, которого все ждут: клиент тянет N сегментов одновременно → N независимых TCP-окон → 120 Мбит. Ровно то, что нужно. Но нигде не реализовано.
⚠️ На webOS это безнадёжно: приложения используют нативный media pipeline (Starfish / HTML5 <video>).
Это чёрный ящик — подменить логику загрузки нельзя. Все клиенты (официальный, Moonfin, Breezyfin) одинаково
однопоточны.
Вывод: ждать нечего — ни от Jellyfin, ни от новых клиентов.
4. Что реально умеет многопоток
| Решение | Многопоток | Пригодность |
|---|---|---|
| aria2 / aria3 | ✅ до 16 соединений | Качает файл, не стримит в плеер |
| jspeedstreamer, node-HLS-Proxy | ✅ параллельный prefetch сегментов | ✅ работает |
nginx proxy_cache + slice |
✅ кэш byte-ranges | ✅ база для prefetcher |
| Infuse (Apple TV) | ✅ параллельные Range | ✅ но не webOS |
| Торрент (много пиров) | ✅ N пиров = N соединений | ✅ по природе |
| Jellyfin / Moonfin / Breezyfin | ❌ 1 соединение | — |
| 8 xray-туннелей + mux | ❌ одно логическое окно | — |
| MPTCP по одному пути | ❌ | — |
Ключевое: все рабочие многопоточные решения — внешние прокси/префетчеры, не клиенты. Прокси стоит рядом с клиентом, тянет параллельно, отдаёт из локального кэша.
5. Lampa + TorrServer + Lampac (webOS)
TorrServer
YouROK/TorrServer (3.0k★, GPL-3.0). Качает торрент, отдаёт HTTP-поток, управляет размером кэша.
- Docker:
ghcr.io/yourok/torrserver:latest, порт 8090 - Health check:
http://<ip>:8090/echo→ версия сервера - Флаги:
-d PATH(БД/конфиг),-a(HTTP Auth),-m BYTES(макс. размер потока),-t DIR(автозагрузка),--gst(GStreamer HLS/fMP4 транскод, сборки 141.10+),--proxyurl - Многопоточность по природе торрента (каждый пир = отдельное соединение)
Lampa
UI-каталог. Установка на LG webOS: Media Station X или LG Content Store.
⚠️ Установка .ipk с флешки на розничных LG не работает.
- Настройки → TorrServer → «Использовать основную ссылку» →
kraken:8090 - Проверка:
http://<ip>:8090/echo - Буфер настраивается: 50–100 МБ (Настройки → Плеер) ← этого нет в webOS Jellyfin-клиенте
- Качество по скорости: до 10 Мбит → 720p; 10–25 → 1080p; >25 → 4K
- Plugin API открыт (
window.Lampa):Lampa.Component.add,Lampa.Activity.push,Lampa.Controller.add,Lampa.Player.play,Lampa.Scroll - Плагины:
etor(TorrServer),kinopoisk.js(папка «Буду смотреть», лимит 50),synology_dlna.js(DLNA)
🔥 Lampac — всё в одном контейнере
immisterio/Lampac / lampac-nextgen/lampac (MIT, .NET 10, порт 9118).
Внутри: TorrServer (subprocess) + JacRed (Jackett-совместимый индексатор) + GStreamer транскод +
DLNA + TmdbProxy + LampaWeb (хостит UI, отдаёт /lg.ipk для LG).
- Плагин для Lampa:
http://<IP>:9118/online.js - Проверка:
curl -fsS "http://localhost:9118/version?type=hash" - ⚠️ В контейнере рабочий каталог
/lampac, файлы читаются из корня, не изconfig/. Volumes по умолчанию закомментированы
⚠️ Торрент-стримеры НЕ смотрят твою библиотеку
Показывают публичные раздачи, не файлы локальной библиотеки. Popcorn Time на webOS нэйтивно не было.
6. 🔴 TorrServer/Lampac на Кра́кене проблему НЕ решает
Многопоточность торрента работает только на участке «пиры → TorrServer». Участок «Lampac/TorrServer → ТВ» — тот же один TCP-поток через узкий линк.
Lampac на Кра́кене: пиры → Кра́кен → [УЗКИЙ ЛИНК, single-flow] → ТВ ❌
Но Lampac даёт то, чего не было: буфер 50–100 МБ + GStreamer HLS-транскод — можно отдать ТВ лёгкий поток 10–15 Мбит, который проходит одним соединением.
Это другое решение той же проблемы: не «обойти узкий канал», а «сделать поток достаточно лёгким».
7. Ранжированные пути (актуальный вывод)
| # | Путь | Усилие | Шанс |
|---|---|---|---|
| 1 | Ограничить битрейт в webOS-клиенте (10–15 Мбит) | 2 мин | Средний, работает сегодня |
| 2 | Moonfin / Breezyfin — нативный pipeline, буфер | ~30 мин sideload | Средний |
| 3 | Lampac на Кра́кене — буфер + GStreamer транскод | Среднее | Средний |
| 4 | Prefetch-proxy (nginx slice / node-HLS-Proxy) | Высокое (пилить) | Высокий, но сложно |
| 5 | Второй ISP на TrueNAS + MPTCP | Дорого | Единственный честный путь к агрегации |
🟡 Развилка: Lampac НЕ смотрит локальную библиотеку
Путь №3 подходит для «просто кино» — публичные раздачи через TorrServer. Для «своей библиотеки» нужно отдельное решение: Lampac/TorrServer файлы библиотеки не отдают → идти в путь №4 (prefetch-proxy) либо в шаг 7 плана (плагин библиотеки).
⚠️ Развилка помечена 2026-09-22 как выдуманная мной, а не поставленная Alex. Alex на неё ответил «Чё блядь». Не требовать от Alex ответа на этот вопрос повторно. Делать шаги 1–6 плана — они от развилки не зависят.
Разбор и отвергнутые варианты: personal/plans/lampac-kraken.
Факты webOS-клиентов (проверено)
| Moonfin | Breezyfin | |
|---|---|---|
| Версия | 2.5.1, 409★ | v0.2.1 (авг 2026), 63★, beta |
| webOS | 3.0+ (2016+) | 5.0+ |
| Движок | Starfish (нативный) | HTML5 + Enact Sandstone |
| Транскод-лимит в UI | ✅ явно есть (Transcoding Limits) |
не заявлен |
| Диагностика «кто отказал в Direct Play» | ✅ есть (Diagnostics & Logging) | есть |
| Jellyfin backend | 10.9.0+, Jellyfin 12 ✅ | 12 auth fix |
| Установка без истечения | ✅ Homebrew Channel (не Dev Mode) | ✅ Homebrew catalog |
⚠️ Dev Mode на LG истекает через 50 часов → sideloaded app исчезает. Homebrew Channel не истекает — оба клиента есть в его каталоге.
⚠️ Ни один не распараллеливает поток. Кодеки определяет железо ТВ, не клиент.
Связанные заметки
- personal/tech/inter-site-throughput-taiga-to-mac — замеры RTT/полосы Taiga ↔ Mac
- personal/tech/xray-reverse-tunnel-kraken-truenas — reverse-туннель, замеры egress
- personal/plans/lampac-kraken — план развёртывания Lampac + блокер «не библиотека»
- family/how-to/kraken-network — линки ТВ, история торможения 4K
- family/how-to/arr-stack-taiga — медиа-стек TrueNAS