Как мне справиться с потерей пакетов при записи видео на сервер через WebRTC
Мы используем MCU licode для потоковой передачи записанного видео с Google Chrome на сервер. Нет второго экземпляра Google Chrome для обработки обратной связи, и сервер должен это сделать.
Одна вещь, с которой мы столкнулись, - это когда кадры потери пакетов отбрасываются, а видео выходит из синхронизации. Это приводит к очень плохому качеству видео.
В ExternalOutput.cpp есть место, где он обнаруживает, что текущий полученный пакет данных не увеличился монотонно. Здесь вы можете увидеть, что он сбрасывает текущий кадр и сбрасывает состояние поиска.
Я хотел бы знать, как изменить это, чтобы он мог восстановиться после потери пакета. Является ли отправка пакета NACK с текущим порядковым номером решением? Я также читал, что есть режим, в котором Google Chrome отправляет RED-пакеты (избыточные), чтобы справиться с потерей пакетов.
1 ответ
Приложения для обработки мультимедиа имеют два основных разных уровня:
- Транспортный уровень ( RTP/ RTCP)
- Уровень кодеков
Транспортный уровень не зависит от кодеков и работает с пакетами RTP/ универсальными RTCP. На этом уровне есть несколько механизмов для борьбы с потерей / задержкой / переупорядочением пакетов:
- Jitter Buffer (обрабатывает задержки пакетов и переупорядочение)
- Generick RTCP Feedbacks (уведомляет исходный узел о потере пакета)
На уровне кодеков есть также несколько механизмов для борьбы с ухудшением качества:
Чтобы преодолеть недостатки Licode, вы должны:
Прежде всего он игнорирует любые задержки пакетов и переупорядочение. Таким образом, вы должны реализовать механизм (буфер джиттера), который будет обрабатывать перезапись пакетов / сетевой джиттер и определять потерю пакетов (возможно, вы могли бы повторно использовать механизмы webrtc/freeswitch)
Когда ваше приложение определяет потерянный пакет, вы должны отправить отзыв ( RTCP NACK) удаленному узлу
Также вы должны попытаться обработать ошибки декодирования ffmpeg (используемые для декодирования видео и сохранения его в файл) и отправить FIR (Fast Intra Request) / PLI удаленному узлу для запроса ключевых кадров в случае ошибок.
Обратите внимание, что п.2,3 требует правильного явного согласования (через SDP).
Только после прохождения всех этих случаев вы можете взглянуть на FECC/RED, потому что это определенно сложнее в управлении и реализации.