henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2024-01-05 12:05 am

Домашній стрімінґ

Щоб стрімати якесь .mp4 чи .mkv, достатньо будь-якого статичного HTTP сервера, який підтримує range requests. Тоді будь-який бовзер або mpv чи vlc зможе грати кєно з seeking (як це українською?), як буде дозволяти пропускна здатність і майже так гарно, ніби .mkv є локальний файла.

Колись нарід писав спеціяльні сервери для стрімінгу, бороли лейтенсі, оптимізували кійфреймні інтервали, але все це швидко померло як тільки веб бовзери отримали <video> елемент.

Якщо десь на хмарній VM ув країні, якій все одно на те що ви торентите, є колекція святкових фільмів, то дивитися її можна сказавши на сервері

$ ruby -run -ehttpd . -b 127.0.0.1 -p 8000

а дома, на клаенті:

$ ssh -L 127.0.0.1:12345:127.0.0.1:8000 -Nv example.com

щоб форвардити з клаенту 127.0.0.1:12345 на сервер example.com HTTP ріквести і читати відповідь, а потім

$ mpv http://127.0.0.1:12345/movie.mkv

щоб кєно дивитися.

Як зробити щось подібне без HTTP серверу?

mpv вміє читати raw TCP потік. Можна просто чекати підключення на якогось порта та зразу відправляти йому .mkv файла. Але тоді mpv з'їсть увесь bandwidth який є, тому наш сервер ліпше має рейт лімітувати потік байтів.

Спочатку я хотів написати елементарний форк-сервер, але згадав про pv та ncat. З цим дуо достатньо пролетарського шелу:

$ cat mickeymousetube
#!/bin/sh

export movie="${1:?Usage: ${0##*/} file.mkv [port]}"
port=${2:-61001}
type pv ncat || exit 1

__dirname=$(dirname "$(readlink -f "$0")")
ncat -vlk -e "$__dirname/libexec.stream.sh" 127.0.0.1 $port

ncat вміє форкати себе та виконувати інший exe, коли клаент підключається.

$ cat libexec.stream.sh
#!/bin/sh
pv -L2M "$movie"

-L2M тут означає макс 2МБ за секунду.

$ mpv tcp://127.0.0.1:61001

буде файла грати.

Недоліком цього є неможливість seeking на клаенті та якщо щось станеться з сокетом (сусід посвердлить вам інторнет кабеля), то дивитися кєно доведеться з самого початку.

З іншої сторони, якщо робити конкурента тіктоку або ютубних шортс, то seeking там є непотрібно, контін ґєнта таких сервісів його відсутності не помітить.

kondybas: (Default)

[personal profile] kondybas 2024-01-04 10:50 pm (UTC)(link)
Тунелювання через ссш з портфорвардом - то лише заради криптування потоку?
kondybas: (Default)

[personal profile] kondybas 2024-01-04 11:22 pm (UTC)(link)
Бгггг

Я дивлюся, що ncat є надмножиною функцій nc/netcat, зокрема по опції -exec. Дуже цікаво, дякую за наводку. Я-то традиційно старим неткатом користуюся, але у варіанті з форком в інший бінарник воно обіцяє багато корисного. netcat -lk XXXXX вхідні потоки з усіх конектів валить в один вихідний потік з розбивкою по \n, який потім треба парсити, а до того додавати ідентифікатори сорцу в кожну строчку. А так можна на колінці змоделювати повноцінний мультитредний термінатор конектів.

Мегасенкс!
juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-01-04 10:52 pm (UTC)(link)

All this is implementable, I guess, but where do the movies come from?

juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-01-04 11:03 pm (UTC)(link)

Понятно.

kondybas: (Default)

[personal profile] kondybas 2024-01-05 09:27 am (UTC)(link)
"..грати кєно з seeking (як це українською?).."

грати кєно з морським королем.
waqur: (Default)

[personal profile] waqur 2024-01-05 01:47 pm (UTC)(link)
Пару лет назад, когда я баловался с туннелированием TCP-соединений через SSH, пропускная способность у этих туннелей не особо блистала. У меня оно порою подтормаживало в том числе и по гигабитной локалке, и даже в пределах одного компа (между хостом и виртуальной машиной). Раз на раз не приходится: то всё летает, то внезапно люто тормозит, скорость типа 1 Мбайт/с. В протоколе SSH есть какое-то собственное управление размером приёмно-передающего буфера, шириной окна или чем-то подобным для этих туннелей, в некоторых клиентах (например WinSCP) по этой теме даже есть какие-то настройки. Не похоже, чтобы эти настройки на что-то могли повлиять, но они как бы есть, да.

Я не помню точно, были ли в моём эксперименте прямые SSH-туннели (-L) или реверсивные (-R), но наверное это и не особо важно, ведь SSH-протокол тот же самый.

А вы так даже кино смотреть пытаетесь. Х*яссе. И чо, работает? И даже смотреть можно? Гм, может в SSH починили что-то там. А какое среднее и дисперсия будет, если замерить этот тоннель через iperf? Тоннель с удалённым сервером я имею в виду.
waqur: (Default)

[personal profile] waqur 2024-01-09 01:12 pm (UTC)(link)
Угу, спасибо за тест. Когда я проверял пару лет назад, у меня скорость сильно варьировалась в этих тестах, от запуска к запуску, в диапазоне от почти нуля до максимума, даже в самых благоприятных условиях (хост-виртуалка). Наверное, в SSH за это время что-то починили.