Когда камер много, открывать их по одной уже неудобно
Камеры стоят в разных местах, но вопрос часто один: что сейчас происходит вокруг дома? Можно открыть телефон, найти нужную камеру, вернуться к списку и выбрать следующую. А можно вывести общий обзор на телевизор.
Для этой задачи у нас уже были Samsung UE49MU6100 2017 года, Home Assistant и домашний сервер на Intel N100 с 8 ГБ памяти. К ним и добавили просмотр десяти камер. Отдельный компьютер у телевизора и HDMI-приставка для этого не понадобились: изображение передаётся по домашней сети.
Проезд и калитка получили больше места
Равные маленькие окошки выглядят аккуратно, но важность у камер разная. Поэтому верхнюю половину экрана поделили между проездом и калиткой. Остальные восемь камер заняли два ряда внизу.
У крупных окон размер 640 × 360, у остальных — 320 × 180. Весь обзор помещается в 1280 × 720. Пропорции исходных кадров сохраняются: края изображения не обрезаются ради красивой сетки.
Большое окно помогает рассмотреть происходящее, но само по себе не добавляет деталей. Для чтения номера машины или разбора спорного момента нужен исходный поток либо запись с камеры.
Телевизор получает одно видео
Открывать на старом телевизоре десять видеоплееров сразу мы не стали. Общую картинку собирает домашний сервер, а Samsung получает один видеопоток HLS. Это способ передавать видео небольшими последовательными фрагментами. Телевизору остаётся воспроизводить их, без страницы с десятком отдельных подключений.
Материал для сетки берётся из Frigate — системы, которая уже получает видео и ищет события на камерах. Сервис обзора запрашивает свежие JPEG-кадры из потоков распознавания, раскладывает их по местам и кодирует общее видео. Отдельный декодер RTSP для каждой камеры ради телевизора не запускается.
Выходной формат — H.264, 720p, три кадра в секунду. Для совместимости добавлена тихая звуковая дорожка AAC: звука с камер в этом обзоре нет.
Три кадра в секунду подходят для общего наблюдения, но движение будет менее плавным, чем в обычной записи. У HLS также возможна задержка в несколько секунд. Для управления воротами по точному моменту на экране такой обзор не подходит.
Зачем выключать сборку, когда никто не смотрит
На N100 работают и другие домашние службы. Было бы странно заставлять его круглые сутки готовить картинку для выключенного телевизора.
Поэтому кодирование запускается по запросу зрителя. Когда запросы видео прекращаются, через 20 секунд сервис останавливает кодировщик и получение кадров для сетки. Сами камеры и Frigate продолжают выполнять свои задачи. Временные фрагменты HLS хранятся в оперативной памяти.
Во время короткой проверки десяти камер сервис обзора использовал около 21% одного процессорного ядра и 164 МиБ памяти. Это расход самого сервиса; дополнительная работа Frigate по подготовке JPEG в эти числа не входит. По ним нельзя судить о нагрузке всего сервера или о его запасе для новых задач.
Такой подход полезен и без погони за минимальными процентами: захотел посмотреть — сборка включилась, закончил — домашний сервер перестал выполнять ненужную работу.
Включение оставили в привычных местах
Обзор запускается существующим переключателем в Home Assistant и кнопками нашего Telegram-бота. Home Assistant отправляет телевизору адрес общего потока. В проверке Samsung переходил в состояние воспроизведения и запрашивал следующие видеофрагменты; выключение через тот же переключатель останавливало показ.
У браузерной версии есть выбор отдельной камеры для увеличения. При передаче готового видео на Samsung этих кнопок поверх картинки нет — это другой способ просмотра. Общая сетка от этого не меняется.
Если появится ещё одна камера, сначала её нужно подключить к Frigate. Только после этого она может попасть в обзор: сервис обновляет список во время просмотра. Самостоятельно искать и настраивать камеры в сети он не умеет.
Как в общей сетке появились две Xiaomi
До телевизора была ещё одна задача: получить видео с Xiaomi во Frigate. В родном приложении обе камеры показывали картинку, но этого оказалось недостаточно для подключения к нашей системе. У Xiaomi свой способ связи, авторизации и передачи видео; универсальный RTSP-адрес для этих двух моделей мы не использовали.
Один бренд, разные способы подключения
Подключали AW200 с кодом модели isa.camera.hlc9a и Camera Home — chuangmi.camera.ipc017. Код модели оказался полезнее общего названия на коробке: у старой Camera Home другой вариант протокола и обработки медиаданных.
Для подключения использовали go2rtc — программу-посредник между камерами и остальной системой. Штатный go2rtc 1.9.14 и проверенная на тот момент официальная версия из ветки разработки видео с нашей пары не подняли. Для Camera Home использовали доработку поддержки IPC017: она добавляет нужные команды и обработку зашифрованного видео старой модели.
Почему понадобился отдельный мост
Была и сетевая проблема: обратные ответы камер не проходили через сетевую трансляцию Docker так, как ожидал клиент. При этом один только перенос штатной программы в сеть хоста проблему не решил.
Рабочую связку получили с доработанным клиентом, отдельной службой на виртуальной машине Frigate и подобранными параметрами каждой камеры. В сборку также вошло исправление сравнения IP-адресов. Основной go2rtc внутри Frigate сохранили: новый мост принимает видео Xiaomi и отдаёт ему обычные RTSP-потоки. Камеры при этом не перепрошивали и не сбрасывали.
Сам мост при проверке занимал около 20 МБ памяти. Декодирование видео во Frigate и сборка сетки для телевизора расходуют ресурсы отдельно — эти 20 МБ не описывают стоимость всей системы.
У AW200 и Camera Home разные настройки качества и звука
Для AW200 рабочим оказался режим subtype=3 с отключённым звуком — audio=0. Для Camera Home использовали subtype=hd; вместе с видео её источник передаёт звуковую дорожку PCMA. Переносить одинаковые параметры на все Xiaomi не стоит: даже номер режима качества у разных поколений может означать разное.
Обе камеры отдают исходное видео 1920 × 1080 в HEVC/H.265. Во Frigate для обновляемых кадров используем 640 × 360 и примерно три кадра в секунду. Полный размер источника не означает, что маленькое окно в общем обзоре тоже показывает Full HD.
Важная граница: для этих двух камер подключили просмотр, а запись, распознавание объектов, сохранение снимков по событиям и анализ звука оставили выключенными. Наличие камеры в сетке само по себе не создаёт архив и уведомления о человеке.
Локальное видео всё ещё зависит от облака при подключении
Связь с камерой идёт внутри домашней сети, но для получения ключей при новом подключении нужен интернет и облако Xiaomi. Поэтому после разрыва связи без интернета поток может не восстановиться. Такую зависимость нельзя убрать одним переносом видео во Frigate.
Мы проверяли не только появление названий в списке: обе камеры отдавали меняющиеся декодированные кадры. После перезапуска моста потоки восстановились; у Camera Home свежие кадры снова появились к 32-й секунде проверки. Для мгновенного переключения на камеру такую паузу нужно учитывать.
Ещё один подвох нашёлся у отключённой второй AW200: в облаке остался старый сетевой адрес, который уже принадлежал другому устройству. Её в обзор не добавляли. Перед подключением важно сверять саму камеру, а не доверять одному адресу из старого списка.
Если повторяете нашу задачу, начните с точного кода модели и документации Xiaomi в go2rtc. Затем проверьте реальные кадры и восстановление связи. Именно эти проверки отделяют работающий просмотр от красивой карточки без видео.
С чего начать, если хочется так же
Сначала стоит открыть Birdseye — готовый общий обзор Frigate. В нём можно показывать все камеры либо те, где есть движение или активные объекты. Для многих задач этого достаточно.
У нас отдельный сервис появился под конкретную комбинацию требований: десять камер одновременно, два крупных окна, воспроизведение на имеющемся Samsung и сборка только по запросу. Если эти требования вам не нужны, начинать с собственного кодировщика незачем.
Перед выбором способа вывода проверьте один совместимый поток на своём телевизоре. Затем определите, какие камеры должны быть крупнее и какая плавность действительно нужна. И отдельно посмотрите, прекращается ли обработка после закрытия просмотра. Кстати, включённая ретрансляция Birdseye заставляет его работать постоянно — это стоит учитывать на небольшом сервере.
В нашем доме получилось отдельное средство для быстрого обзора камер. Экран с планом дома и состояниями устройств остаётся другой задачей, которую ещё дорабатываем.
