Ни одного кадра без фона
Человек включает размытие, чтобы спрятать то, что за спиной. Значит, один необработанный кадр — это не мелкий недочёт, а провал всей функции.
Размытие и замена фона в видеозвонке кажутся решённой задачей: берёшь готовую библиотеку, включаешь процессор — готово. Мы так и начали. А потом посмотрели на разговор со стороны собеседника и нашли три места, где фон утекал.
Для кого эта функция
Фон включают не ради красоты. Дома за спиной кухня, дети, неубранная комната. Человек выбирает размытие, чтобы это не увидели. Поэтому главный критерий — не качество размытия, а то, что ни один кадр без фона не уходит собеседникам. «Включим хоть как-нибудь» здесь хуже отказа.
Три утечки
1. Камера публикуется раньше фона
Стандартный способ включить камеру сразу публикует видеодорожку, а фон догоняет через пару секунд — пока грузится модель сегментации. Эти секунды собеседники видят комнату. Решение: собираем дорожку руками и ставим обработку до публикации.
2. Библиотека отдаёт первый кадр необработанным
Даже с процессором, поставленным до публикации, первый кадр уходил без фона. Причина нашлась в библиотеке: пока считается первая маска, она отдаёт наружу копию необработанного кадра — «чтобы не было чёрного экрана». Для большинства случаев разумно. Для нашего — нет.
Решение: публикуем дорожку только после того, как пришёл первый обработанный кадр. Если за восемь секунд обработка не заработала, камера не включается вовсе, и человеку прямо сказано почему.
3. Старый процессор на выключенной камере
Сменили фон, пока камера выключена, — а при включении поднималась старая дорожка со старым процессором или без него. Теперь при смене фона на выключенной камере старая дорожка снимается с публикации.
Как проверяли
Глазами такое не проверить: кадр длится сотые доли секунды. Мы подключили к комнате программного собеседника, который измерял резкость каждого полученного кадра. Камера — поддельная камера браузера на настоящей видеокарте. Первый же полученный кадр размыт; смена фона на ходу, отключение фона при выключенной камере и замена на картинку доходят как задумано.
Одна деталь: в браузере без видеокарты обработка выдаёт четыре кадра в секунду, и проверять фон там бессмысленно — это свойство программного рендеринга, а не кода.
Файлы модели — свои
По умолчанию библиотека тянет свои файлы с публичного CDN, а модель — с серверов Google. Это значило бы три проблемы: разговор ломается, когда CDN недоступен из сети клиента; каждый, кто включил фон, сообщает о себе чужому сервису; версия файлов может разойтись с собранным приложением. Поэтому файлы модели и среды выполнения раздаёт наш сервер, а грузятся они лениво — при первом включении фона.
Где фона нет
На телефоне кнопку фона мы не показываем: сегментация каждого кадра греет телефон за минуты. И в браузерах без нужных возможностей графики кнопки тоже нет — лучше её отсутствие, чем фон, который не работает.
Остальное о звонках — на странице звонков и расшифровки.