Восстановление видео из необработанных RTP-пакетов и SDP

Вопрос или проблема

У меня есть камера, использующая протокол RTSP. Я настроил медиапоток и сохранил данные RTP на диск, и теперь хочу восстановить видео в обычном формате, таком как mp4 или mov, из сохраненных данных RTP.

Следуя протоколу RTSP, я отправляю OPTIONS, DESCRIBE, SETUP и PLAY, а также периодически поддерживаю соединение. Когда я начинаю получать RTP-пакеты через UDP, я сохраняю заголовок и данные RTP-пакета на диск в один файл, получается что-то вроде:

00000000  80 60 00 01 00 54 3b eb  ae d6 07 78 67 4d 40 28  |.`...T;....xgM@(|
00000010  8d 8d 40 3c 01 13 f2 e0  2d c0 40 40 50 00 00 3e  |..@<....-.@@P..>|
00000020  80 00 0e a6 0e 86 01 e8  00 00 5f 5e 0b bc b8 d0  |.........._^....|
00000030  c0 3d 00 00 0b eb c1 77  97 0a 80 60 00 02 00 54  |.=.....w...`...T|
00000040  3b eb ae d6 07 78 68 ee  38 80 80 60 00 03 00 54  |;....xh.8..`...T|

Как видно из повторяющегося 8060000X, где X увеличивается, этот короткий фрагмент из начала файла содержит три RTP-пакета.

Когда я настроил медиасессию, я также получил SDP от камеры:

v=0
o=- 1 1 IN IP4 10.10.10.2
s=RTSP Session
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=range:npt=now-
m=video 0 RTP/AVP 96
a=control:rtsp://10.10.10.2/media/1/1/video
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4d4028;sprop-parameter-sets=Z01AKI2NQDwBE/LgLcBAQFAAAD6AAA6mDoYB6AAAX14LvLjQwD0AAAvrwXeXCg==,aO44gA==
a=recvonly
m=application 0 RTP/AVP 98
a=control:rtsp://10.10.10.2/media/1/1/meta
a=rtpmap:98 vnd.onvif.metadata/90000
a=recvonly

Я пробовал огромное количество различных команд ffmpeg, но почти все они заканчиваются одинаково: Invalid data found when processing input. В основном это вариации ffmpeg -i input.rtp -vcodec libx264 output.mp4

Вообще возможно ли восстановить видео из этой информации? Я предполагал, что RTP и SDP будет достаточно, но не нашел ничего, что предполагало бы такую возможность.

Ответ или решение

Создание видео из исходных RTP-пакетов и SDP является технической задачей, требующей понимания сетевых протоколов, методов кодирования видео и инструментов для работы с мультимедиа. Давайте разберём этот процесс с использованием метода TEA (теория, пример, применение).

Теория

RTP (Real-time Transport Protocol) — это протокол, который широко используется для передачи аудио- и видеоданных в режиме реального времени. SDP (Session Description Protocol) применяется для описания параметров мультимедийной передачи, таких как формат кодирования, частота кадров и другие технические характеристики.

Когда вы получаете RTP-пакеты и SDP, этого вполне достаточно для реконструкции видео, однако необходим правильный подход к обработке данных. RTP-пакеты содержат полезные данные, фрагменты видеопотока, закодированного в формате H.264, который был указан в SDP.

SDP-документ предоставляет следующую информацию:

  • Формат кодирования: H264/90000, что означает использование кодека H.264 при частоте дискретизации 90,000 Гц.
  • Параметры профиля: profile-level-id=4d4028 и другие sprop-параметры, которые важны для правильной интерпретации видеопотока.
  • Порты и контрольные URL: которые необходимы для правильной настройки потоковой передачи.

Формат H.264 часто используется в видеонаблюдении и IP-камерах из-за своей эффективности компрессии и поддержке высоких разрешений. Для реконструкции видео необходимо управлять потоком кодированных кадров, собранных из фрагментов, полученных через RTP.

Пример

Ваши RTP-пакеты, сохранённые на диск, содержат заголовки и закодированные фрагменты видео, как, например:

00000000  80 60 00 01 00 54 3b eb  ae d6 07 78 67 4d 40 28
...

В этих данных:

  • Первая строка (например, 80 60 00 01) отображает заголовок RTP.
  • Остальная часть после заголовка представляет собой полезную нагрузку, содержащую фрагмент закодированного видеофрейма.

Задача — извлечь эти фрагменты, объединить их в валидный видеопоток и сохранить в формате, таком как MP4 или MOV.

Применение

На практике, для реконструкции видео из RTP и SDP данных, следуйте следующим шагам:

  1. Извлечение NAL-единиц (Network Abstraction Layer):
    Каждый RTP пакет содержит полезные фрагменты видеоданных (NAL единицы), которые нуждаются в правильной сборке и декодировании.

  2. Построение видеопотока:
    Объедините NAL-единицы из всех полученных RTP-пакетов в последовательный видеопоток H.264. Это этап, где создаётся двоичный файл видео, который читается инструментами для дальнейшей кодировки или преобразования.

  3. Использование ffmpeg или аналогичных инструментов:
    Допустим, у вас есть файл с чистым H.264. Вы можете использовать ffmpeg для преобразования этого потока в распространённый контейнерный формат:

    ffmpeg -f h264 -i input.h264 -vcodec copy output.mp4

    Убедитесь, что пакетные параметры и структура файла соответствуют ожиданиям ffmpeg, иначе можно столкнуться с ошибкой о некорректных данных.

  4. Использование специализированных библиотек:
    Иногда стандартных инструментов может быть недостаточно, и потребуется использование библиотек, таких как GStreamer или LibAV, которые могут предложить более точную обработку отдельных частей видеопотока.

  5. Отладка и настройка:
    Если ffmpeg выдаёт ошибки, это может быть вызвано неправильно оформленным входным H.264, отсутствием начальных кадров, заголовков или incorrect marker bit, учитываемых при передаче через RTP. Настройте свои инструменты и проверяйте, что все исходные данные корректно парсятся.

Таким образом, RTP и SDP действительно предоставляют достаточную информацию для реконструкции видео, важно лишь корректно извлечь, обработать и интерпретировать полученные данные. В процессе, вероятно, потребуется точная настройка инструментов и понимание специфики мультимедийных форматов, чтобы успешно выполнить преобразование данных без потерь в качестве или информации.

Оцените материал
Добавить комментарий

Капча загружается...