Стратегии отправки статических изображений через видеопотоки WebRTC - PullRequest
3 голосов
/ 10 апреля 2019

Я использую WebGL для компоновки 2D-изображений в холст. Я также хочу передать немного другую версию этих изображений по сети через WebRTC. Сейчас я использую канал данных для отправки PNG, извлеченных из холста. Хотя это работает нормально, оно медленное (кодирование PNG не является бесплатным, а также не ускоряется аппаратно) и не будет работать для анимации (изменения, которые затрагивают только небольшие части изображения со скоростью ~ 30 кадров в секунду). Есть интерфейс captureStream() canvas, который позволяет мне извлекать видео канал из его буфера рендеринга, который я могу передать в WebRTC. Видеокодеки могут справиться со всеми проблемами эффективности, которые мне теперь приходится решать вручную, и это было бы здорово. Я получил это на работу, но у него много проблем:

  • captureStream не позволяет мне указывать внеэкранный буфер рендеринга, поэтому мне приходится открывать дополнительный контекст WebGL для каждого потока (для каждого требуется несколько МБ загруженных текстур).
  • Начальный битрейт настолько низок, что вы получаете только несколько блоков размытых цветов. До сих пор все мои попытки увеличить начальный битрейт не увенчались успехом, и все имеющиеся варианты относятся только к Chrome и не поддерживаются в Firefox.
  • Если я отправляю одно и то же изображение несколько раз, проблема пропускной способности со временем решается (пока это все на локальной машине). Однако:
  • Исходное изображение не отправляется, если только на изображении не было каких-либо изменений до того, как было установлено соединение.
  • requestFrame(), похоже, ничего не делает. Я читал, что для этого нужно изменить картинку. Перерисовка всего кадра стоит дорого, я хочу этого избежать, если что-то на самом деле не изменилось.
  • Все работает, когда я явно перерисовываю все со скоростью 15 кадров в секунду, но браузер замедляется почти до полной остановки. Также кажется расточительным посылать полный видеопоток со статическим изображением.

WebGL не имеет явного вызова рендеринга (как swapbuffer в некоторых реализациях OpenGL), так что же используется для определения того, что что-то действительно изменилось на рисунке? Могу ли я каким-то образом подделать это, ничего не перерисовывая?

Кто-нибудь знает, есть ли исправление для этого подхода? Похоже, что стандарт WebRTC делает все возможное, чтобы заблокировать этот вариант использования и включать только видеопотоки с веб-камеры.

...