210 lines
13 KiB
Markdown
210 lines
13 KiB
Markdown
---
|
||
title: Многопоточный стриминг и обход single-flow лимита (Jellyfin / webOS / TorrServer)
|
||
created: '2026-09-21'
|
||
updated: '2026-09-22'
|
||
type: research
|
||
namespace: personal
|
||
status: research-complete
|
||
tags:
|
||
- jellyfin
|
||
- webos
|
||
- streaming
|
||
- tcp
|
||
- lampa
|
||
- torrserver
|
||
- bandwidth
|
||
related:
|
||
- '[[personal/tech/inter-site-throughput-taiga-to-mac]]'
|
||
- '[[personal/tech/xray-reverse-tunnel-kraken-truenas]]'
|
||
- '[[family/how-to/kraken-network]]'
|
||
---
|
||
|
||
# Многопоточный стриминг — что реально существует
|
||
|
||
> **Контекст:** 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/projects/media-toolbox-taiga]] — медиа-стек TrueNAS
|