Пять препятствий — камера через сеть с Claude Code

Read in Other Languages
Loading…

Пять препятствий — камера через сеть с Claude Code

Взять камеру, подключённую к одному компьютеру, и завести её в программу трансляции на другом. На бумаге — пять минут работы.

El Turco | Analyst

У меня было две машины. ThinkPad 2015 года — два ядра, восемь гигабайт — с подключённой камерой Akaso. И MacBook с работающим OBS. Обе в одной сети Tailscale.

Задача была ясна: провести изображение камеры через сеть и подать в OBS.

Возникло пять препятствий. Каждое — в своём слое.

Первая попытка была самой прямой: захватить камеру, сжать, отправить по UDP.

Пакеты ушли. Не пришло ничего.

UDP — тот трафик, который меньше всего любят межсетевые экраны и виртуальные сети. Вместо того чтобы искать, где он теряется, мы сменили дорогу: TCP. SSH уже работал поверх TCP, значит, этот путь был открыт.

Перешли на TCP, открыли порт, добавили правило в брандмауэр. Соединение отклонено.

Причина была тонкой. При подключении по SSH у пользователя были права администратора — но сессия не была повышена. В Windows это не одно и то же. Правило брандмауэра молча не применилось.

Вместо того чтобы пробивать стену, мы обошли её целиком: SSH-туннель. Провели видео внутри канала, который уже работал.

Туннель поднялся, ffmpeg запустился и через четыре секунды умер.

Ошибка была прямой: буфер реального времени переполнен, кадр отброшен.

Не получив других указаний, камера вернулась к значению по умолчанию: 3840×2160. Сжимать 4K в реальном времени — не работа для двухъядерного процессора 2015 года.

Решение состояло из двух частей. Мы зафиксировали разрешение на 1920×1080. И перенесли сжатие с процессора в Intel Quick Sync — аппаратный кодировщик внутри графического чипа.

Камера умела выдавать H.264 сама. Значит, решили мы, передадим как есть, без обработки. Нагрузка на процессор — ноль.

Приёмная сторона не смогла это раскодировать. Лог повторял одну строку: ссылка на несуществующий PPS 0.

Камера не помещала в начало потока заголовки, описывающие картинку — SPS и PPS. Видеопоток без заголовков — как текст без алфавита.

Мы взяли MJPEG и перекодировали через Quick Sync. На шаг больше, зато заголовки на месте.

Всё заработало. Изображение пришло. Потом исчезло.

Проверил: запущенного процесса не было. Журнал ошибок пуст. Программа не падала — её убили.

Причиной был сам SSH. В Windows SSH-сессия привязывает запущенные процессы к объекту задания; закрывается сессия — уходят и потомки. Разрывая соединение, я разрывал и камеру.

Мы превратили трансляцию в запланированную задачу. Теперь она не зависит от сессии, живёт сама по себе и перезапускается после каждого обрыва.

Изображение пришло. Сидя за столом, я увидел себя на собственном экране — но это изображение вышло из ноутбука рядом, прошло через шифрованный туннель и вернулось.

И вот главная находка: двухъядерный десятилетний ноутбук сжимает видео 1080p30, пока его процессор почти простаивает. Благодаря Quick Sync. Я считал эту машину слабой. Слабыми были мои настройки.

Ни одно из пяти препятствий не было нехваткой железа. Все пять — это конфигурация, протокол и поведение операционной системы.

Купи я новую мощную машину, все пять появились бы точно так же.

Построить систему — не значит купить мощные детали. Это значит выяснить, по одной, почему детали отказываются разговаривать друг с другом.

⚙️ Технические детали — машины, цифры, команды

ThinkPad T470 — i5-6300U · 2C/4T · 8 GB · Intel HD 520 · Windows 10 Pro
Kamera — Akaso (UVC, MJPEG 1920×1080 @30)
Kodlayıcı — Intel Quick Sync (h264_qsv)
Taşıma — MPEG-TS over TCP, SSH reverse tunnel (Tailscale)
Kalıcılık — Windows Scheduled Task

Series
Loading…