Ни одного кадра с настоящим фоном

Человек включает размытие, чтобы спрятать то, что за спиной. Значит, один необработанный кадр — это не мелкий недочёт, а провал всей функции.

Размытие и замена фона в видеозвонке кажутся решённой задачей: берёшь готовую библиотеку, включаешь обработку — готово. Мы так и начали. А потом посмотрели на разговор глазами собеседника и нашли три места, где настоящий фон всё-таки попадал к нему.

Для кого эта функция

Размытие включают не ради красоты. Дома за спиной кухня, дети, неубранная комната. Человек выбирает размытие, чтобы это не увидели. Поэтому главное — не качество размытия, а то, что собеседники не получают ни одного кадра с настоящим фоном. «Включим хоть как-нибудь» здесь хуже, чем не включить камеру вовсе.

Три утечки

1. Видео уходит раньше, чем включается размытие

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

2. Библиотека отдаёт первый кадр необработанным

Даже когда обработка стояла до отправки, первый кадр уходил с настоящим фоном. Причина нашлась в библиотеке: пока первая маска — контур человека в кадре — ещё не готова, библиотека отдаёт наружу копию необработанного кадра, «чтобы не было чёрного экрана». Для большинства случаев разумно. Для нашего — нет.

Решение: отправляем видео только после того, как готов первый обработанный кадр. Если за восемь секунд обработка не заработала, камера не включается вовсе, и человеку прямо говорим почему.

3. Старая обработка на выключенной камере

Человек менял фон, пока камера выключена, — а при включении возвращалось старое видео со старой обработкой или вовсе без неё. Теперь, если сменить фон на выключенной камере, старое видео отключается совсем.

Как проверяли

Глазами такое не проверить: кадр длится сотые доли секунды. Мы подключили к звонку программу-собеседника, которая измеряла резкость каждого полученного кадра. Камеру заменял тестовый видеосигнал браузера, а обработка шла на настоящей видеокарте. Первый же полученный кадр размыт; смена фона на ходу, отключение фона при выключенной камере и замена на картинку работают как задумано.

Одна деталь: в браузере без видеокарты обработка выдаёт четыре кадра в секунду, и проверять фон там бессмысленно — так работает отрисовка без видеокарты, наш код тут ни при чём.

Файлы модели — с нашего сервера

По умолчанию библиотека загружает свои файлы из публичной сети раздачи файлов (CDN), а модель — с серверов Google. У такого подхода три минуса: звонок ломается, если CDN недоступен из сети компании; каждый, кто включил фон, сообщает о себе чужому сервису; версия файлов может не совпасть с версией приложения. Поэтому модель и всё, что нужно для её работы, раздаёт наш сервер, а загружается это только при первом включении фона.

Где размытия нет

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

Остальное о звонках — на странице «Звонки и расшифровка».