Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакетов, повторная сборка NAL)

Исправьте сломанное RTSP-видео из-за фрагментации RTP H.264 FU-A. Охватывает недостающие фрагменты, ошибки начального/конечного бита, сбои повторной сборки NAL, потерю пакетов, MTU и ошибки декодера с помощью реальных диагностических команд.

h264 фу-а, фрагментация rtp, rtsp-видео, потеря пакетов, сборка последнего блока, ошибка декодера h264, rtsp-диагностика

H.264 через RTP дает сбои, которые выглядят как ошибки декодера, но на самом деле являются проблемами пакетизации. Сеанс RTSP работает. DESCRIBE возвращает действительный SDP. НАСТРОЙКА прошла успешно. PLAY возвращает 200 ОК. Пакеты RTP поступают с правильным типом полезной нагрузки, сопоставленным с H.264. Тем не менее, на видео видны повреждения блоков, зависания, черные кадры или ошибки декодера.

В ваших журналах ошибки выглядят следующим образом:

[h264 @ 0x...] invalid NAL unit size
[h264 @ 0x...] missing picture in access unit
[h264 @ 0x...] non-existing PPS 0 referenced
[h264 @ 0x...] decode_slice_header error
[h264 @ 0x...] no frame!

The fast answer

Why fragmentation exists

The structure of an FU-A packet

Each FU-A RTP packet contains:

Byte 0: FU indicator
  bit 7: F (forbidden_zero_bit) — normally 0
  bits 6-5: NRI (nal_ref_idc) — priority
  bits 4-0: Type = 28 (FU-A)
Byte 1: FU header
  bit 7: S (Start) — 1 for first fragment
  bit 6: E (End) — 1 for last fragment
  bit 5: R (Reserved) — always 0
  bits 4-0: Type — original NAL unit type (1=non-IDR, 5=IDR, 7=SPS, 8=PPS)
Byte 2+: Fragment payload — the actual NAL unit data

Полная последовательность FU-A для одного блока NAL:

Packet 1: FU indicator (type=28) | FU header (S=1, E=0, type=5) | payload[0..N]
Packet 2: FU indicator (type=28) | FU header (S=0, E=0, type=5) | payload[N+1..M]
Packet 3: FU indicator (type=28) | FU header (S=0, E=0, type=5) | payload[M+1..P]
Packet 4: FU indicator (type=28) | FU header (S=0, E=1, type=5) | payload[P+1..END]

The RTP marker bit

Failure modes: what breaks and why

Failure 1: Missing middle fragment

Expected:  1000(S)  1001(M)  1002(M)  1003(E|marker)
Received:  1000(S)  1001(M)  [LOST]   1003(E|marker)

Повторный ассемблер видит начальный фрагмент, один средний фрагмент, затем конечный фрагмент, но байты полезной нагрузки не соединяются. В собранном блоке NAL имеется зазор.

Симптомы:

  • Блок коррупции в горизонтальной полосе кадра
  • Декодер сообщает «неверный размер блока NAL».
  • Коррупция ограничена одной единицей доступа (сбрасывается при следующем РДЭ)

Ошибка 2: отсутствует начальный фрагмент.

Expected:  1000(S)  1001(M)  1002(E)
Received:  [LOST]   1001(M)  1002(E)

Failure 3: Missing end fragment

Expected:  1000(S)  1001(M)  1002(E|marker)
Received:  1000(S)  1001(M)  [LOST]

Переассемблер никогда не видит конечный фрагмент. Граница подразделения NAL никогда не подтверждается. Декодер ожидает новых данных, которые так и не приходят.

Симптомы:

  • Видео зависает
  • Декодер сообщает: «Отсутствует изображение в блоке доступа»
  • Воспроизведение останавливается до прибытия следующего устройства полного доступа.

Ошибка 4: фрагменты не в порядке

Expected:  1000(S)  1001(M)  1002(E)
Received:  1000(S)  1002(E)  1001(M)

Diagnostic workflow

Step 1: Confirm H.264 payload mapping

m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4D0029;sprop-parameter-sets=...
  • packetization-mode=1 означает режим без чередования (поддерживается FU-A)
  • packetization-mode=0 означает режим одного блока NAL (без фрагментации — очень ограничено)

Шаг 2. Отслеживание порядковых номеров RTP

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

Seq 1000: FU-A Start, NAL type 5 (IDR)
Seq 1001: FU-A middle
Seq 1003: FU-A End, marker=1   ← gap at 1002

Step 3: Inspect FU-A headers

Byte 0 (FU indicator):
  0x7C = NRI=3, Type=28 (FU-A)

Байт 1 (заголовок FU):
  0x85 = S=1, E=0, R=0, Type=5 (срез IDR) ← начальный фрагмент IDR
  0x45 = S=0, E=0, R=0, Type=5 ← средний фрагмент
  0x65 = S=0, E=1, R=0, Type=5 ← конечный фрагмент; маркер только если эта NAL завершает единицу доступа

Неправильные значения для поиска:

  • S=1 в незапускаемом пакете → путаница переассемблера
  • Маркер установлен до E=1 → ложная граница единицы доступа
  • E=1 без маркера может быть допустимым, если далее следует другая единица NAL
  • Тип меняется в середине последовательности → ошибка кодировщика или повреждение потока.

Шаг 4. Проверьте полную сборку.

Для каждой единицы NAL:

  1. Найти стартовый фрагмент (S=1)
  2. Следуйте последовательным номерам последовательности до конечного фрагмента (E=1).
  3. Сосчитайте фрагменты; проверить отсутствие пробелов в последовательности
  4. Сопоставьте маркер с границей единицы доступа; не требуйте его для каждого конечного фрагмента FU-A.
  5. Убедитесь, что все фрагменты имеют одинаковую метку времени и тип NAL.

Шаг 5. Сравните виды транспорта

Запустите один и тот же поток через UDP и TCP с чередованием. Если видео чистое по TCP, но поврежденное по UDP, проблема заключается в потере сетевых пакетов, а не в проблемах с кодером или декодером.

Шаг 6. Анализ РДЭ и не-РДЭ

Кадры IDR больше и требуют большего количества фрагментов FU-A на единицу NAL. Больше фрагментов = больше риска потери пакетов. Если искажения появляются в основном при смене сцен или каждые несколько секунд (с интервалом IDR), жертвой становятся кадры IDR.

Варианты исправления:

  • Уменьшите размер кадра IDR (уменьшите разрешение или битрейт для ключевых кадров).
  • Увеличьте интервал IDR (меньше больших кадров, но медленнее восстановление после потери)
  • Уменьшите MTU для FU-A в кодере (больше фрагментов, но каждый меньше и с меньшей вероятностью вызовет фрагментацию IP).

Стратегии восстановления

На сборщике

  • Отбрасывайте поврежденные блоки доступа полностью, а не подавайте частичные данные в декодер.
  • Запросить новый кадр IDR через RTCP (если поддерживается камерой)
  • Подождите следующего кадра IDR (декодер восстановится автоматически)

At the encoder

  • Уменьшите предел размера единицы NAL, чтобы уменьшить количество фрагментов на единицу доступа.
  • Используйте периодическое внутреннее обновление вместо полных кадров IDR (меньшие ключевые кадры).
  • Включите FEC (прямое исправление ошибок), если стек RTP его поддерживает.

В сети

  • Переключитесь с UDP на TCP с чередованием, если потеря пакетов неизбежна.
  • Убедитесь, что обнаружение MTU пути работает (избегайте фрагментации IP)
  • Приоритизация трафика RTP на перегруженных каналах

Когда это не ФУ-А

Не все повреждения H.264 являются фрагментацией FU-A. Проверять:

  • Отсутствует SPS/PPS: Ошибки декодера, например «несуществующий PPS» — проверьте наборы параметров SDP sprop.
  • Неправильный профиль/уровень: Декодер не справляется со сложностью потока.
  • Ошибка кодировщика: Кодер выдает неверный синтаксис единицы NAL.
  • Повреждение битового потока в источнике: Неисправен кодер камеры, а не сеть.

Если пакеты RTP приходят с правильными порядковыми номерами и правильными заголовками FU-A, но декодер все равно выходит из строя, проблема заключается в самом битовом потоке H.264, а не в транспорте.

<!-- rtsp-localized-evidence-foundation-v1:start -->

Воспроизводимая проверка темы «Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакетов, повторная сборка NAL)»

Краткий ответ: чёрный экран или одиночный код не доказывает источник сбоя. Надёжная диагностика связывает запрос и ответ RTSP, согласованный Transport, действующую Session, а затем номера последовательности RTP, временные метки и данные RTCP. Для «Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакетов, повторная сборка NAL)» начните с уровня, ближайшего к симптому, но сохраняйте единую временную шкалу, чтобы не смешать управление, сеть и декодирование.

До изменения камеры, межсетевого экрана или VMS создайте небольшой базовый тест. Запишите RTSP URL без пароля, время, путь, запрошенный Transport, ответ сервера и момент первого медиапакета. Проверяйте UDP и TCP interleaved отдельно, если устройство поддерживает оба режима. Не меняйте одновременно путь, учётные данные и транспорт: иначе успешная вторая попытка не покажет решающую переменную.

Уровень Сохраняемое доказательство Вопрос
RTSP метод, статус, заголовки, CSeq и Session Сервер принял именно эту операцию?
SDP control, payload type, clock rate и codec Описана ожидаемая дорожка?
Transport client_port, server_port или interleaved Обе стороны используют один канал?
RTP SSRC, sequence, timestamp и marker Медиаданные идут в объяснимом порядке?
RTCP sender report, CNAME и BYE Часы, идентичность и конец прослеживаются?
Decoder SPS/PPS/VPS и packetization mode Полученный payload позволяет инициализацию?

Разделяйте «медиа не пришло» и «медиа пришло, но не декодируется». Отсутствие RTP после успешных SETUP и PLAY ведёт к проверке UDP, NAT, firewall и ответа Transport. Пробелы последовательности доказывают потерю или перестановку. Непрерывный RTP без изображения переводит расследование к payload type, clock rate, границам кадра и параметрам H.264 или H.265. Эта граница полезнее общего сообщения проигрывателя.

Как написать цитируемый ответ?

Используйте три предложения: последняя успешная операция, первое отсутствующее доказательство и следующий разделяющий тест. Пример: «DESCRIBE, SETUP и PLAY успешны; RTP не приходит на объявленные порты клиента; проверка TCP interleaved отделит блокировку UDP от неверного медиапути». Не обвиняйте камеру или сеть без ответа либо пакета, подтверждающего границу.

Что делает случай воспроизводимым?

Сохраните OPTIONS, DESCRIBE, SETUP и PLAY, SDP, ответ Transport и очищенный Session. Для RTP запишите SSRC, первый и последний sequence, clock rate, число пробелов и длительность. Результат VLC или другой VMS используйте как дифференциальный тест, а не как доказательство правильной реализации всех правил успешным клиентом.

Когда проверять сервер или клиент?

Проверяйте сервер при отказе метода, несуществующем control URL, несовместимом Transport или необъяснимой смене SSRC или часов. Проверяйте клиент при повторном старом nonce, потере Session, запросе UDP без открытых портов или трактовке каждого конца NAL как конца access unit. Для промежуточной неисправности каждому выводу нужны пакет и время.

Как проверить отчёт?

Повторите тест с нового соединения и сравните временные шкалы до первого отличия. Удалите пароли и полные Authorization. Свяжите выводы с CSeq, sequence или timestamp. Используйте связанный справочник RTSP, а RTSP Inspector — для локальной проверки RTSP-потока и сбора доказательств без загрузки видео в публичный сервис.

Добавьте явный критерий приёмки. На том же URL и с теми же учётными данными управляющие запросы должны завершиться ожидаемыми статусами, RTP — непрерывно идти по выбранному Transport, а после нужных параметров кодека должен восстановиться реальный кадр. Смена Session или SSRC после нового подключения сама по себе не является ошибкой; не объединяйте пакеты старой и новой сессии. Оставшуюся неопределённость формулируйте как непроверенный порт, трек, интервал времени или условие декодера, а не как общий «сбой камеры».

<!-- rtsp-localized-evidence-foundation-v1:end --><!-- multilingual-blog-closeout:start -->

Прямой ответ и граница приемки

Краткий ответ по теме «Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакетов, повторная сборка NAL)»: Исправьте сломанное RTSP-видео из-за фрагментации RTP H.264 FU-A. Охватывает недостающие фрагменты, ошибки начального/конечного бита, сбои повторной сборки NAL, потерю пакетов, MTU и ошибки декодера с помощью реальных диагностических команд. Считайте это проверяемым результатом, а не обещанием для любого входа, устройства, проекта или окружения. Полный результат фиксирует исходное состояние, точное действие, видимый выход и условие, подтверждающее завершение задачи в RTSP Inspector.

Порядок работы от доказательств

Начните с небольшого повторяемого случая до изменения полного проекта. Запишите версию приложения, систему, идентификатор входа или устройства, важные настройки и ожидаемый результат. Выполните одно осознанное действие, сохраните первый неожиданный переход и сравните с исправным случаем, если он есть. Одновременная смена нескольких параметров скрывает условие, создавшее или устранившее проблему.

Контрольная точка 1: Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакето

Проверяйте «Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакетов, повторная сборка NAL)» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 2: Исправьте сломанное RTSP-видео из-за фрагментации RTP H.264 FU-A. Охватывает недостающие ф

Если «Исправьте сломанное RTSP-видео из-за фрагментации RTP H.264 FU-A. Охватывает недостающие фрагменты, ошибки начального/конечного бита, сбои повторной с» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 3: The fast answer

Проверяйте «The fast answer» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 4: Why fragmentation exists

Если «Why fragmentation exists» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 5: The structure of an FU-A packet

Проверяйте «The structure of an FU-A packet» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 6: The RTP marker bit

Если «The RTP marker bit» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 7: Failure modes: what breaks and why

Проверяйте «Failure modes: what breaks and why» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 8: Failure 1: Missing middle fragment

Если «Failure 1: Missing middle fragment» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Контрольная точка 9: Ошибка 2: отсутствует начальный фрагмент.

Проверяйте «Ошибка 2: отсутствует начальный фрагмент.» на минимальном репрезентативном входе. Не меняйте несвязанные настройки, повторите то же действие и проверьте результат после повторного открытия или подключения. Один снимок слабее записи с входом, настройкой, действием, выходом и временем.

Контрольная точка 10: Failure 3: Missing end fragment

Если «Failure 3: Missing end fragment» неоднозначен, сравните исправный и ошибочный случаи в одинаковых условиях. Отметьте первое значимое различие вместо списка последующих симптомов. Эта граница дает более ясное обращение в поддержку и безопасный следующий опыт.

Матрица приемки

Точка Сохраняемое доказательство Критерий успеха
Исправление фрагментации H.264 FU-A RTP: почему ваше RTSP-видео не работает (потеря пакетов, повторная сборка NAL) Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
Исправьте сломанное RTSP-видео из-за фрагментации RTP H.264 FU-A. Охватывает недостающие фрагменты, ошибки начального/ко Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
The fast answer Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
Why fragmentation exists Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
The structure of an FU-A packet Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат
The RTP marker bit Исходное состояние, одно действие и результат Второй оператор воспроизводит заявленный результат

Изоляция, восстановление и передача

Остановитесь на первой неуспешной границе. Сохраните источник, проект, сеанс или захват, сделайте копию перед разрушающим редактированием и меняйте одну переменную за опыт. Повтор широкого процесса после нескольких изменений может дать иной результат без объяснения причины.

Отличайте отсутствие доказательств от доказательства отсутствия. Пустой экран может означать неверный вход, область, фильтр, права, устройство, период или состояние проекта. Подтвердите получение или импорт до толкования decoder, редактора, отчета или экспорта.

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

Вопросы и ответы

Как надежнее всего начать?

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

Какие доказательства сохранять?

Сохраните идентификатор входа, версию, платформу, настройки, точное действие, первый неожиданный переход и конечный выход. Закройте и повторно откройте проект, сеанс, отчет или экспорт.

Когда повторять процедуру?

После значимого изменения приложения, системы, драйвера, прошивки, модели, источника или процесса. Сохраните предыдущий принятый случай как неизменную основу сравнения.

Когда результат готов к передаче?

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

Связанные руководства

Эти страницы на том же языке описывают соседние этапы, не меняя канонического владельца темы:

<!-- multilingual-blog-closeout:end -->