Домашній стрімінґ
Jan. 5th, 2024 00:05Щоб стрімати якесь .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 там є непотрібно, контін ґєнта таких сервісів його відсутності не помітить.