Как мне справиться с потерей пакетов при записи видео на сервер через WebRTC

Мы используем MCU licode для потоковой передачи записанного видео с Google Chrome на сервер. Нет второго экземпляра Google Chrome для обработки обратной связи, и сервер должен это сделать.

Одна вещь, с которой мы столкнулись, - это когда кадры потери пакетов отбрасываются, а видео выходит из синхронизации. Это приводит к очень плохому качеству видео.

плохое качество видео

В ExternalOutput.cpp есть место, где он обнаруживает, что текущий полученный пакет данных не увеличился монотонно. Здесь вы можете увидеть, что он сбрасывает текущий кадр и сбрасывает состояние поиска.

Я хотел бы знать, как изменить это, чтобы он мог восстановиться после потери пакета. Является ли отправка пакета NACK с текущим порядковым номером решением? Я также читал, что есть режим, в котором Google Chrome отправляет RED-пакеты (избыточные), чтобы справиться с потерей пакетов.

1 ответ

Решение

Приложения для обработки мультимедиа имеют два основных разных уровня:

  1. Транспортный уровень ( RTP/ RTCP)
  2. Уровень кодеков

Транспортный уровень не зависит от кодеков и работает с пакетами RTP/ универсальными RTCP. На этом уровне есть несколько механизмов для борьбы с потерей / задержкой / переупорядочением пакетов:

  1. Jitter Buffer (обрабатывает задержки пакетов и переупорядочение)
  2. Generick RTCP Feedbacks (уведомляет исходный узел о потере пакета)

На уровне кодеков есть также несколько механизмов для борьбы с ухудшением качества:

  1. Обратная связь по уровню кодеков RTCP
  2. Прямое исправление ошибок (FECC/RED)

Чтобы преодолеть недостатки Licode, вы должны:

  1. Прежде всего он игнорирует любые задержки пакетов и переупорядочение. Таким образом, вы должны реализовать механизм (буфер джиттера), который будет обрабатывать перезапись пакетов / сетевой джиттер и определять потерю пакетов (возможно, вы могли бы повторно использовать механизмы webrtc/freeswitch)

  2. Когда ваше приложение определяет потерянный пакет, вы должны отправить отзыв ( RTCP NACK) удаленному узлу

  3. Также вы должны попытаться обработать ошибки декодирования ffmpeg (используемые для декодирования видео и сохранения его в файл) и отправить FIR (Fast Intra Request) / PLI удаленному узлу для запроса ключевых кадров в случае ошибок.

Обратите внимание, что п.2,3 требует правильного явного согласования (через SDP).

Только после прохождения всех этих случаев вы можете взглянуть на FECC/RED, потому что это определенно сложнее в управлении и реализации.

Другие вопросы по тегам