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