Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RTC почти RTC и 🧟‍♂️

RTC почти RTC и 🧟‍♂️

Доклад о RTC, WebRTC и проблемах с которыми сталкиваются наши пользователи пытаясь это все реализовать

Polina Gurtovaya

May 13, 2021
Tweet

More Decks by Polina Gurtovaya

Other Decks in Programming

Transcript

  1. WebRTC больше 10 лет, зачем опять об этом рассказывать? RTC

    актуально в условиях повышенной изоляции На первый взгляд WebRTC сложная штука, но на самом деле это не так RTC и WebRTC активно развиваются • WebRTC теперь IETF стандарт 🎉 • Появляются новые интересные API (об этом позже)
  2. Пересылаем: видео с веб-камеры аудио файлики скриншару Формулируем задачу Внешние

    условия: лагающий интернет любые устройства с браузером внутри пользователи за fi rewall Дополнительные требования: Используем самый «прямой» из доступных способов Пользователей может быть много У потоков может быть разный приоритет Все должно шифроваться 🧟 🧟
  3. Транспорт: медленно и надежно или быстро и опасно? • Следит

    за состоянием • Гарантирует правильный порядок доставки • Ничего не теряет • Ограничивает количество пакетов Просто посылает пакеты по адресу :)
  4. ICE Agent: 1. Собирает кандидатов. 2. Для каждой пары кандидатов

    поверяет возможность соединения. trickle ICE: Постепенно собирает кандидатов. Сигналим о том кого нашли.
  5. Безопасность Использовать TLS поверх UDP не получится • UDP не

    гарантирует доставку пакетов • UDP не гарантирует порядок доставки DTLS: TLS для UDP • Нумерует пакеты • Повторно пересылает потерянное • Ограничивает размеры записи
  6. Пересылаем данные Media: SRTP + SRTCP Data: SCTP Шифрование Работает

    поверх UDP→быстрее Можно терять пакеты, если нужно Не гарантирует порядок Bundling
  7. Итого: Нам нужно придумать signaling Нам нужен STUN и TURN

    DTLS, SCTP, SRTP, ICE gathering сделает за нас browser
  8. 25

  9. Итого: Если участников много, нам нужно продумать топологию нашей сети.

    Хорошим начальным решением будет SFU: разруливает SVC и Simulcast, может быть нодой в сети
  10. WebCodecs const decoder = new VideoDecoder({ output: (frame) => {/*

    do something */}, error: console.log }); await videoDecoder.configure({codec: 'vp8'}); decoder.decode(chunk);
  11. WebTransport const transport = new WebTransport('https://example.com'); await transport.ready; const stream

    = await transport.createSendStream(); const writer = sender.getWriter(); writer.write(new Uint8Array([68, 69, 70]));
  12. Insertable-streams const stream = await getUserMedia({ video: true }); const

    track = stream.getVideoTracks()[0]; const processor = new MediaStreamTrackProcessor({ track }); const generator = new MediaStreamTrackGenerator({ kind: 'video' }); const transformer = new TransformStream({ async transform(frame, controller) { const newFrame = processFrameSomehow(frame); videoFrame.close(); controller.enqueue(newFrame); }, }); trackProcessor.readable.pipeThrough(transformer).pipeTo(trackGenerator.writable); trackGenerator.readableControl.pipeTo(trackProcessor.writableControl);
  13. ML чтобы генерировать смешные шапочки! Пересылать большие файлы А еще:

    СSP, Worker Support, raw media processing, GPU, stream transformation, синхронизация аудио+видео c данными и больше безопасности Будущее: WebRTC NV?
  14. А что там под капотом? libwebrtc libyuv libopus libvpx… libwebrtc

    libyuv libopus libvpx… libyuv libopus libvpx… webrtc-rs
  15. Фронтенду на заметку Не забывайте обрабатывать случай отсутствия разрешений для

    getUserMedia / getDisplayMedia Камер и микрофонов может быть несколько. Выбор камер требует разрешения Придется писать очень много асинхронной логики. Нужно использовать https даже локально await navigator.mediaDevices.enumerateDevices() https://github.com/jfromaniello/selfsigned/pull/43