Вопрос или проблема
У меня есть камера, использующая протокол 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 данных, следуйте следующим шагам:
-
Извлечение NAL-единиц (Network Abstraction Layer):
Каждый RTP пакет содержит полезные фрагменты видеоданных (NAL единицы), которые нуждаются в правильной сборке и декодировании. -
Построение видеопотока:
Объедините NAL-единицы из всех полученных RTP-пакетов в последовательный видеопоток H.264. Это этап, где создаётся двоичный файл видео, который читается инструментами для дальнейшей кодировки или преобразования. -
Использование ffmpeg или аналогичных инструментов:
Допустим, у вас есть файл с чистым H.264. Вы можете использоватьffmpeg
для преобразования этого потока в распространённый контейнерный формат:ffmpeg -f h264 -i input.h264 -vcodec copy output.mp4
Убедитесь, что пакетные параметры и структура файла соответствуют ожиданиям ffmpeg, иначе можно столкнуться с ошибкой о некорректных данных.
-
Использование специализированных библиотек:
Иногда стандартных инструментов может быть недостаточно, и потребуется использование библиотек, таких как GStreamer или LibAV, которые могут предложить более точную обработку отдельных частей видеопотока. -
Отладка и настройка:
Если ffmpeg выдаёт ошибки, это может быть вызвано неправильно оформленным входным H.264, отсутствием начальных кадров, заголовков или incorrect marker bit, учитываемых при передаче через RTP. Настройте свои инструменты и проверяйте, что все исходные данные корректно парсятся.
Таким образом, RTP и SDP действительно предоставляют достаточную информацию для реконструкции видео, важно лишь корректно извлечь, обработать и интерпретировать полученные данные. В процессе, вероятно, потребуется точная настройка инструментов и понимание специфики мультимедийных форматов, чтобы успешно выполнить преобразование данных без потерь в качестве или информации.