USER
-> 2025-06-29 09:42:32.688876622: длительность: 0.108921 s 0.109
[h264 @ 0x39a290] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[h264 @ 0x39a290] Frame num change from 0 to 4
[h264 @ 0x39a290] decode_slice_header error
[h264 @ 0x39a290] concealing 377 DC, 377 AC, 377 MV errors in I frame
[h264 @ 0xefc60] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
3 2025-06-29 09:42:32.864740539: длительность: 0.104764 s 0.105, 2: queue size: 0
[h264 @ 0x39a290] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[h264 @ 0x39a290] Frame num change from 0 to 5
[h264 @ 0x39a290] decode_slice_header error
[h264 @ 0x39a290] concealing 426 DC, 426 AC, 426 MV errors in I frame
-> 2025-06-29 09:42:32.971420830: длительность: 0.109428 s 0.109
[h264 @ 0xefc60] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
3 2025-06-29 09:42:33.110193789: длительность: 0.111250 s 0.111, 2: queue size: 0
-> 2025-06-29 09:42:33.216407997: длительность: 0.108975 s 0.109
[h264 @ 0x39a290] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[h264 @ 0x39a290] Frame num change from 0 to 6
[h264 @ 0x39a290] decode_slice_header error
[h264 @ 0x39a290] concealing 475 DC, 475 AC, 475 MV errors in I frame
[h264 @ 0xefc60] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
3 2025-06-29 09:42:33.345543997: длительность: 0.098378 s 0.098, 2: queue size: 0
-> 2025-06-29 09:42:33.451794955: длительность: 0.108981 s 0.109
[h264 @ 0x39a290] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[h264 @ 0x39a290] Frame num change from 0 to 7
[h264 @ 0x39a290] decode_slice_header error
[h264 @ 0x39a290] concealing 524 DC, 524 AC, 524 MV errors in I frame
[h264 @ 0xefc60] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
3 2025-06-29 09:42:33.588812372: длительность: 0.105995 s 0.106, 2: queue size: 0
-> 2025-06-29 09:42:33.695020164: длительность: 0.108950 s 0.109
[h264 @ 0xefc60] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0xefc60] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 0xefc60] nal_unit_type: 5(IDR), nal_ref_idc: 3
3 2025-06-29 09:42:33.868759580: длительность: 0.109862 s 0.110, 2: queue size: 0
-> 2025-06-29 09:42:33.975082580: длительность: 0.109054 s 0.109
[h264 @ 0xefc60] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[rtsp @ 0x629d0] max delay reached. need to consume packet
[rtsp @ 0x629d0] RTP: missed 13 packets
[h264 @ 0x39a290] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x39a290] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 0x39a290] nal_unit_type: 5(IDR), nal_ref_idc: 3
[H264 Decoder @ 0x11cd80] Broken frame packetizing
3 2025-06-29 09:42:34.160729580: длительность: 0.159759 s 0.160, 2: queue size: 0
[h264 @ 0x39a290] bytestream overread -7
[h264 @ 0x39a290] error while decoding MB 2 25, bytestream -7
[h264 @ 0x39a290] concealing 272 DC, 272 AC, 272 MV errors in I frame
[h264 @ 0x39a290] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[h264 @ 0x39a290] Frame num change from 0 to 1
[h264 @ 0x39a290] decode_slice_header error
[h264 @ 0x39a290] concealing 321 DC, 321 AC, 321 MV errors in I frame
[h264 @ 0x39a290] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
[h264 @ 0x39a290] Frame num change from 0 to 2
[h264 @ 0x39a290] decode_slice_header error
[h264 @ 0x39a290] concealing 370 DC, 370 AC, 370 MV errors in I frame
-> 2025-06-29 09:42:34.265172205: длительность: 0.110302 s 0.110
[h264 @ 0xefc60] nal_unit_type: 1(Coded slice of a non-IDR picture), nal_ref_idc: 2
3 2025-06-29 09:42:34.344231664: длительность: 0.102726 s 0.103, 2: queue size: 0
-> 2025-06-29 09:42:34.450427205: длительность: 0.108935 s 0.109
при таких параметрах
av_dict_set(&options, "rtsp_transport", "udp", 0); // UDP обычно дает меньшую задержку, хотя и менее надежен (важно для низкой задержки)
av_dict_set(&options, "max_delay", "300000", 0); // максимальная задержка 100 мс (меньше 1)
av_dict_set(&options, "buffer_size", "65536", 0); // размер буфера 64 Кб
av_dict_set(&options, "probesize", "5000000", 0); // 5 Мб (уменьшено для быстрого определения потока)
av_dict_set(&options, "analyzeduration", "500000", 0); // 1 секунда анализа (лучше уменьшить для быстрой инициализации)
av_dict_set(&options, "fflags", "nobuffer", 0); // отключить внутренние буферы
av_dict_set(&options, "flags", "low_delay", 0); // включить режим низкой задержки в декодере
av_dict_set(&options, "tune", "zerolatency", 0); // оптимизация кодека на минимальную задержку (применимо к энкодеру, иногда полезно для декодера)
av_dict_set(&options, "rtt_timeout", "3000000", 0); // таймаут RTSP 3 секунда (зависит от источника)
//av_dict_set(&options, "timeout", "5000000", 0); // общий таймаут в микросекундах (5 секунда)
av_dict_set(&options, "pkt_size", "1316", 0); // UDP пакет размер (можно подогнать под MTU)
av_dict_set(&options, "stimeout", "5000000", 0); // timeout для сокета (обязательно)
av_dict_set(&options, "fflags", "genpts", 0); // генерируем таймштамы, убираем nobuffer
ASSISTANT
Судя по логам, у вас большие ошибки декодирования h264 и пропуски RTP-пакетов с UDP:
- `[rtsp @ ...] RTP: missed 13 packets`
- `[h264 @ ...] decode_slice_header error`, `concealing DC, AC, MV errors in I frame`
- `[rtsp @ ...] max delay reached. need to consume packet`
---
## Что происходит
1. **Потеря RTP пакетов при приёме UDP**, потери идут в виде пропуска пакетов (`missed X packets`).
2. Ошибки декодирования из-за неполных или испорченных NAL-единиц (кадров H264).
3. `max_delay` в 300000 (300ms) слишком мал — FFmpeg не успевает дождаться всех пакетов и принудительно переходит к следующему.
В результате — декодер пытается восстановить кадры из повреждённых данных, появляется много ошибок и артефактов.
---
## Рекомендации
### 1. Перейдите на TCP RTSP транспорт (рекомендуется)
UDP очень чувствителен к потерям пакетов, которые неизбежны в сети даже LAN. Для стабильного воспроизведения и минимизации ошибок лучше использовать TCP:
```c
av_dict_set(&options, "rtsp_transport", "tcp", 0);
```
### 2. Увеличьте max_delay
Чтобы FFmpeg мог собирать пакеты, установите большее значение:
```c
av_dict_set(&options, "max_delay", "700000", 0); // 700 мс или даже 1с (1000000)
```
### 3. Используйте совместимые флаги `fflags`
`"nobuffer"` и `"genpts"` могут конфликтовать, попробуйте оставить **только `"nobuffer"` для низкой задержки**:
```c
av_dict_set(&options, "fflags", "nobuffer", 0);
// av_dict_set(&options, "fflags", "genpts", 0); // не используйте вместе с nobuffer
```
`genpts` генерирует таймштамы, но увеличивает задержку.
### 4. Проверьте размер и настройку UDP пакетов
Параметр `pkt_size=1316` обычно подходит для MTU Ethernet (1500 байт - overhead):
- Можно экспериментировать с размером UDP пакетов, чтобы уменьшить фрагментацию.
---
## Итоговый рекомендуемый набор параметров для стабильной работы и минимальной задержки:
```c
av_dict_set(&options, "rtsp_transport", "tcp", 0); // TCP - стабильно, с минимальными потерями
av_dict_set(&options, "max_delay", "700000", 0); // задержка 700ms
av_dict_set(&options, "buffer_size", "65536", 0); // буфер 64 Кб
av_dict_set(&options, "probesize", "500000", 0); // анализ 0.5 Мб - достаточно, медленнее открывается, но быстрее старт
av_dict_set(&options, "analyzeduration", "500000", 0); // анализ 0.5 сек
av_dict_set(&options, "fflags", "nobuffer", 0); // убрать лишнюю задержку буферов
av_dict_set(&options, "flags", "low_delay", 0); // режим низкой задержки
av_dict_set(&options, "tune", "zerolatency", 0); // улучшение с нулевой задержкой (для энкодера)
av_dict_set(&options, "stimeout", "5000000", 0); // тайм-аут сокета 5 сек
av_dict_set(&options, "rtt_timeout", "3000000", 0); // тайм-аут RTT 3 сек
```
---
## Дополнительно
- Запустите FFmpeg с логированием `-loglevel debug` для более детального отлова проблем.
- Проверьте сеть (LAN) на потери UDP пакетов (ping, iperf).
- Если камера или сеть ограничивает TCP - рассмотрите настройку FEC (если камера поддерживает).
- Если задержка критична и UDP обязательна, возможно увеличить `max_delay` до 1 секунды, но с риском увеличения задержки.
---
Если после перехода на TCP всё ещё есть проблемы — напишите, посмотрим дальше.