Unity Render Streaming
Что-то на неделе я задался идеей сделать свой AR стриминг. Идея его довольно проста в своей сути:
1) Отправляем с устройства позицию камеры в сцене (+ записываем в память кадр видео с таймштампом, и позицию отправляем с ним же)
2) Рендерим Unity сцену исходя из полученной позиции камеры
3) Возвращаем фрейм из Unity с альфа каналом + таймштамп
4) Склеиваем 2 кадра (из юнити и видео)
5) Отправляем результат в очередь на вывод
Дальше регулируя задержку вывода в зависимости от сети и широты канала можно получить неплохой эффект. Но так как, я люблю стандарты, то писать свой протокол стриминга мне не особо хочется. Поэтому я решил поискать "а что есть готового?" И наткнулся на очень интересный пакет. Из коробки конечно он не совсем нужный функционал покрывает, но делает скажем так 80% работы. Это https://docs.unity3d.com/Packages/com.unity.renderstreaming@3.1/manual/
Сделано там всё на основе WebRTC, у него есть ряд довольно странных багов (скину скрины ниже) Но в целом для прототипа идеи попрёт. И главное вывод можно делать хоть в браузер. Хоть куда хочется
Почему важно, что он основан на WebRTC? Протоколов стриминга на самом деле много, но более менее стандартными являются RSTP, HLS, LL HLS, RTMP, RTMP Tuned, DASH, SRT и так далее. И все они в отличии от WebRTC имеют в среднем задержку более секунды. А мы же хотим "почти реалтайм")
У WebRTC же с другой стороны так же есть проблема. Он поддерживает 24 битные цвета без альфа канала. Но в целом, если мы на цветовую информацию отдадим по 6 бит на цвет, то альфу как-нить запихнём. Стандартные плееры будут конечно выводить чушь, но вот кастомный — скушает и не подавится. Что можно сделать шейдером, даже не меняя сам энкодинг-декодинг. Просто интерпретировать по-другому информацию о цвете на гпу при выводе
В общем если дойду до чего-то вменяемого, залью реализацию этого дела на гитхаб) А пакет в целом рекомендую поковырять, он любопытный :) Для моей же идеи мне кажется нужно ковырять https://docs.unity3d.com/Packages/com.unity.webrtc@2.4