Техника | Почти Блог | [astrr]
Техника

Про стримы и захват видео с Nintendo Switch


Недавно я решил наконец-то пройти The Legend of Zelda: Breath of the Wild на Master Mode.
Для тех, кто не знает - это режим, в котором ты начинаешь игру с начала, но враги становятся намного сильнее, и игра в целом перестаёт тебя щадить.

Так вот, я захожу в игру, выбираю Master Mode, и тут мне в голову приходит идея, что было бы прикольно застримить моё прохождение для друзей (и в целом ради записи моих страданий).
Однако, сделать нормальный стрим было намного более сложной задачей, чем прохождение игры)

Начнем с того, что у меня нет карты захвата, а значит, что нужно использовать програмные способы захвата видео, что очень часто бывает крайне костыльным. Я нашел модуль для своей цели, SysDVR, подключил свич к OBS, и всё вроде бы заработало.

Однако, как только я начал смотреть тестовую запись, я понял, что что-то в ней было не так. Оказалось, что видео отстаёт от моего голоса. И если бы это была фиксированная задержка, то я бы смог просто добавить задержку к голосу, но нет, она менялась в течение записи. В итоге первый стрим я провёл, постоянно регулируя задержку между голосом и видео, и всё равно оно вышло очень так себе.

Поэтому на следующий день я решил попробовать уменьшить задержку видео.

<техническая инфа> Если раньше видео передавалось по TCP тоннелю между NS и ПК, а потом превращалось в локальный RTSP на стороне ПК (или RSTP, отстаньте, мне и так сложно а тут еще и буквы нужно по порядку ставить), который потом подхватывался OBS через 127.0.0.0:6666, то теперь NS подключен к точке доступа моего ноутбука, и транслирует RTSP напрямую, где его ловит VLC (потому что у него можно настроить размер буфера) через 192.168.1.N:6666, а OBS просто записывает окно VLC.<конец технической инфы>

Это помогло уменьшить задержку с 5-15 секунд до 1-3 секунд, но это всё еще было проблемно синхронизировать, и из-за потоковой природы этого метода видео стало намного чаще терять кадры и выдавать прочие артефакты, так что это тоже не подходило.

Однако, был ещё один способ. Если не передавать звук, то SysDVR поддерживает передачу видео в MPV (плеер) с очень низкой задержкой (менее 100мс). Однако, появилась новая проблема.

Звук.
Изначально на моем ноутбуке нет 3.5 аудио входа, только выход и 4 USB Type-C. Голос я сначала записывал через встроенный микрофон, но очень быстро понял, что это тоже ужасный вариант. В итоге я нашел относительно нормальный микрофон и USB-3.5mm адаптер, что и использую для записи звука сейчас.

Но теперь нужно еще как-то захватывать звук с NS, и из вариантов в голову приходит только выход для наушников на консоли. Но порт на ноутбуке только один (ну, по сути их вообще нет, но с адаптером один), так что просто подключить его не получится.

Что же я сделал? Bluetooth адаптер? Второй компьютер для захвата звука? Отдельная программа для передачи звука?

Об этом я расскажу в следую…
Нет, мне лень писать еще один пост))

Я просто нашел второй адаптер. Да, всё так скучно. В мою защиту, мне пришлось припаять к нему новый разъём потому что старый заржавел, так что это был не самый очевидный вариант)

В итоге, свич передаёт видео на ПК описанным выше способом, а в его разъём для наушников воткнут раздвоитесь, один выход которого идет напрямую в мои наушники, а другой - в USB адаптер, через который он поступает в ПК.

Надеюсь, что сетап больше не будет сильно меняться (разве что если в сторону упрощения), а пока что вот.

Как я сервер на NGINX поднимал.


Началось все с того, что я хотел сделать что-нибудь со своим старым сайтом, Astrr.github.io (сейчас там почти ничего нет). Однако, уже в процессе работы над новым сайтом я вспомнил про свободный сервер, на котором хостится мой (пустой) Minecraft сервер, и решил использовать его, на нем как раз была куча свободной производительности.

Однако, после простой настройки NGINX и проброски портов мои приключения не закончились. Почему-то сервер был доступен в локальной сети (хоть по домену, хоть по глобальному или локальному IP), но извне его было не достать. Самое интересное в том, что один из плагинов на Майнкрафт сервере имел веб интерфейс на порту 8123, который в роутере был открыт параллельно со стандартным для HTTP портом 80, и этот интерфейс спокойно открывался извне.

Выглядит как будто провайдер просто блокирует 80 порт, но нет, если поменять порт интерфейса на 80, а сайта - на 8123 (или любую другую комбинацию портов) - работать все еще будет только веб интерфейс плагина.

Дальше я потратил ещё один (уже третий по счёту) день на попытки отключить и так уже выключенный файрвол и пробросить уже проброшенное. Ничего не помогало.

Решение оказалось значительно прозаичнее, хоть я и до сих пор не до конца понял, как это мешало конкретно NGINX. Оказалось, что мой провайдер (очевидно, в связи с ковидом и увеличенной нагрузкой на сеть) отключил мне опцию статичного IP, которая была у меня уже более двух лет. Однако, я не заметил этого потому что хоть опция и была отключена, мой IP не менялся. Я не понимаю почему, скорее всего система управления тарифами не смогла нормально сообщить об изменениях системе, раздающей IP. В любом случае, хоть мой айпи и не изменялся, включение этой опции обратно внезапно открыло доступ к NGINX из интернета.

Спасибо, ****, у меня ведь столько свободного времени, почему бы и не потратить его на решение твоей ошибки?