WebRTC: синхронизировать видеокадры между пирами JavaScript и нативным кодом - PullRequest
0 голосов
/ 11 октября 2018

Это соответствует дизайну, который я пытаюсь реализовать надлежащим образом: у меня есть одноранговый узел JavaScript, который отправляет видеодорожку на одноранговый узел Native Code .В какой-то момент во время передачи (фактически сразу после того, как соединение было установлено, но это может быть в любой момент), я хочу запустить секундомер на стороне JS-партнера и выполнить некоторые временные операции, фактически некоторую визуализацию на холсте с наложением воспроизведения видео.,Со стороны нативного однорангового узла я хочу иметь возможность синхронизировать в тот момент, когда секундомер запускается на одноранговом узле JS, и рассматривать только принятые кадры, записанные после этого момента, выполняя некоторые другие виды обработки.Что я сейчас делаю (хрупкое и ограничивающее решение):

  • Как только пиры подключаются, отслеживая RTCPeerConnection.iceConnectionState, я запускаю секундомер на пире JS;
  • Как толькокогда первое webrtc::VideoFrame поступает на нативный узел, я сохраняю временную спам кадра;
  • На нативном узле я использую метку времени первого кадра, чтобы вычислить относительное время аналогичным образом, секундомер позволяет мне на одноранговом узле JS.

Этот дизайн является ограничением, потому что я могу захотеть синхронизироваться в любой момент, а не только при установлении соединения между равноправными узлами, а также хрупким, потому что я думаю, что протокол WebRTC позволяет отбрасывать самые первые полученные кадры по любой причине (задержкиили ошибки передачи).В идеале я хотел бы взять временную метку в выбранной точке синхронизации в одноранговом узле JS, отправить ее нативному одноранговому узлу и иметь возможность сравнивать webrtc::VideoFrame временных меток.Я не могу сделать это наивно, потому что VideoFrame::timestamp_us() явно искажен некоторым количеством, о котором я не знаю.Также я не могу интерпретировать VideoFrame::timestamp(), который плохо документирован в api/video/video_frame.h, VideoFrame::ntp_time_ms() устарел и фактически всегда возвращает -1.Что я должен сделать, чтобы выполнить синхронизацию между двумя узлами?

1 Ответ

0 голосов
/ 16 февраля 2019

Дизайн может быть правильно реализован путем отправки меток времени синхронизации в NTP отправитель время получателю.Затем получатель должен иметь возможность оценивать временные метки NTP отправителя на кадрах, сравнивая их с временной меткой события синхронизации.Патч проверки концепции, позволяющий использовать этот метод, существует и был передан в проект Native WebRTC в этой отслеживаемой проблеме .Подробности будут позже.

...