Засылать данные по видеоканалу WebRTC - довольно интересная с инженерной точки зрения задача. На ум сразу приходит решение в виде стеганографии: внедрять в картинку последовательность пикселей определенных цветов на одной стороне, и расшифровывать на другой. Но, к сожалению, энкодер просто съест нужную информацию и на выходе мы получим мусор. Поэтому в голову пришла мысль: что, если мы встроимся в часть пайплайна аккурат до VP8? Для этого пришлось спустится на уровень ниже. Туннель работает поверх TrackLocalStaticSample - в нем pion отправляет VP8 фреймы как видеосемплы. Поэтому мы посылаем фреймы двух типов:
Keepalive - настоящие VP8 фреймы (interframe 17 байт, keyframe 30 байт каждый 60-й фрейм). Отправляются с частотой 25fps по таймеру когда нет данных. Нужны чтобы SFU/TURN считал видеопоток живым и не отключал
Data - фрейм данных: [0xFF][4 байта длина][payload]. Маркер 0xFF отличает от VP8 (у keyframe bit0=0, у interframe bit0=1, поэтому первый байт никогда не 0xFF)
Таким образом удается построить bidirectional канал связи, и отсылать данные как для download, так и для upload. Единственное ограничение - ширина канала за счет специфики, из-за чего скорость ограничена в среднем 1.2 (+/- 0.2) мб/с. Тем не менее такой поток довольно сложно заметить/перехватить (в случае, если начнут обрубать по сигнатурам/VP8 фреймам - их всегда можно обновить/зашифровать). Я бы, наверное, советовал пользоваться именно этим каналом, так как он еще и меньше нагружает инфраструктуру, и его обычно достаточно для базового взаимодействия в интернете.
Оно реализовано в обновленном релизе v0.1.5 - [Исходники], [Билды]
Сейчас там по умолчанию установлен DataChannel, для видео нужно переключиться в выпадающем списке. Для того, чтобы оно работало, необходимо, чтобы и у creator’a и у joiner’а совпадали каналы передачи данных (video - video, data channel - data channel). Так же необходимо, чтобы при заходе в звонок через video channel в интерфейсе была включена камера (реальную камеру оно не включает - можно не давать разрешения, так как поток все равно фейковый), потому что иначе нужный канал данных просто не откроется, и подключение провалится
Post #253
4.51K

- 🔥 51
- 🙏 1