Чтение логов FFMPEG и диагностика проблем

Работа с сетевыми видеопотоками через FFMPEG часто сопровождается неожиданными сбоями: камера не отвечает, изображение пропадает, звук отстаёт или вовсе отсутствует. В таких ситуациях первое, к чему следует обратиться — это логи FFMPEG. Они содержат ключевую информацию о состоянии соединения, причинах сбоев и внутренних процессах обработки медиапотока.
Этот материал поможет вам научиться читать и интерпретировать сообщения FFMPEG, понимать, где искать проблему, и какие действия предпринять для её устранения. Мы разберём типичные ошибки, научимся включать подробное логирование и рассмотрим реальные сценарии диагностики.
Ошибки подключения к сетевым источникам
Одни из самых частых проблем при работе с FFMPEG — это неудачные попытки подключиться к источнику потока. Это может быть IP-камера по RTSP, RTMP-сервер или SRT-шина. Причины могут быть как на стороне клиента (FFMPEG), так и на стороне сервера.
Типичные сообщения и их значение
401 Unauthorized / 403 Forbidden
Эти HTTP-подобные коды возвращаются при попытке доступа к RTSP-потоку.
- 401 Unauthorized — сервер требует аутентификацию, но она не предоставлена или неверна.
-
Пример в логе:
[rtsp @ 0x55a1b2c3d0] method DESCRIBE failed: 401 Unauthorized -
Что проверить:
- Правильно ли указаны логин и пароль в URL:
rtsp://user:pass@ip:port/stream. - Поддерживает ли камера передачу учётных данных в URL (некоторые прошивки блокируют это).
- Не изменился ли пароль или не сработала ли блокировка после нескольких попыток.
- Правильно ли указаны логин и пароль в URL:
-
- 403 Forbidden — аутентификация прошла, но у пользователя нет прав на доступ к этому потоку.
-
Пример:
[rtsp @ 0x55a1b2c3d0] method DESCRIBE failed: 403 Forbidden -
Что проверить:
- Уровень доступа пользователя в настройках камеры.
- Доступен ли указанный профиль потока (например,
stream2,high,low) для данного пользователя.
-
💡 Совет: Используйте утилиты вроде
curlили ONVIF-менеджер для проверки доступа к камере отдельно от FFMPEG. Это поможет локализовать проблему: сеть/аутентификация или именно FFMPEG.
Connection timed out
Соединение не установлено в течение ожидаемого времени.
-
Пример:
[tcp @ 0x55a1b2c3d0] Connection to tcp://192.168.1.100:554?timeout=5000000 failed: Connection timed out -
Возможные причины:
- Камера или сервер не в сети.
- Неверный IP-адрес или порт.
- Фаервол или NAT блокируют соединение.
- Камера перегружена и не отвечает.
-
Что делать:
- Проверьте доступность устройства через
pingиtelnet <ip> <port>. - Убедитесь, что порт RTSP (обычно 554) или SRT (например, 7001) открыт.
- Увеличьте таймаут в FFMPEG:
-timeout 10000000(в микросекундах).
- Проверьте доступность устройства через
method DESCRIBE failed
Критическая ошибка при попытке получить описание потока по RTSP.
-
Пример:
[rtsp @ 0x55a1b2c3d0] method DESCRIBE failed: 404 Not Found -
Что это значит:
- Сервер не нашёл запрошенный поток (неверный URL).
- Камера не поддерживает RTSP или отключена.
- Некорректный URL (например,
/live.sdpвместо/stream1).
-
Решение:
- Проверьте точный RTSP-URL через документацию камеры или ONVIF-инструмент.
- Убедитесь, что поток включён в настройках камеры.
🧩 Пример из практики:
Камера Dahua. URLrtsp://admin:pass@192.168.1.50:554/cam/realmonitor?channel=1&subtype=0— еслиsubtype=1, поток может быть недоступен, если не настроен. ОшибкаDESCRIBE failedв этом случае — не ошибка FFMPEG, а отсутствие потока на стороне камеры.
Проблемы приёма и воспроизведения потока
Даже если подключение установлено, могут возникать проблемы с приёмом данных: поток «рвётся», появляются артефакты, теряется синхронизация.
Потери пакетов и переполнение буфера
FFMPEG сообщает о сетевых проблемах через сообщения вроде:
[rtsp @ 0x55a1b2c3d0] RTP: missed 12 packets
или
[buffer @ 0x55a1b2c3d0] Buffer queue overflow, dropping.
Что означают эти сообщения:
| Сообщение | Причина | Что делать |
|---|---|---|
RTP: missed N packets | Потеря пакетов в сети (UDP), джиттер, перегрузка канала | Перейти на TCP (-rtsp_transport tcp), проверить сеть, уменьшить битрейт |
Buffer queue overflow | Входной буфер FFMPEG переполнен — данные приходят быстрее, чем обрабатываются | Увеличить размер буфера (-rtbufsize 100M) или уменьшить нагрузку на CPU |
Buffer underflow | Буфер опустошился — данных не хватает для декодирования | Увеличить буфер, проверить стабильность соединения |
💬 Важно: При использовании UDP (например, в RTSP или UDP/RTP) потери пакетов — норма. FFMPEG не может их восстановить, если не используется FEC или ретрансмиссия (как в SRT).
Рассинхронизация аудио и видео (A/V desync)
Иногда звук опережает или отстаёт от видео. В логах это может проявляться косвенно:
[AVSync] audio timestamp 123456 < video timestamp 124000, difference too large
или просто:
Non-monotonic DTS in output stream
Причины:
- Разная задержка в аудио- и видеопотоках.
- Потери пакетов в одном из потоков.
- Нестабильные временные метки (PTS/DTS) от источника.
Как диагностировать:
- Включите подробное логирование (см. ниже) и следите за PTS/DTS.
- Используйте
-probesizeи-analyzedurationдля лучшего определения параметров потока. - В крайнем случае — принудительно синхронизируйте через фильтры:
async=1,aresample,setpts.
🎯 Пример:
При работе с RTMP-сервером, перегруженным трансляциями, аудио может буферизоваться сильнее, чем видео. Решение — уменьшить буферы на стороне сервера или использовать SRT с настройкойlatency.
Включение подробного логирования
По умолчанию FFMPEG выводит только критические ошибки. Чтобы глубже диагностировать проблему, нужно включить расширенный режим логирования.
Уровни детализации
FFMPEG поддерживает несколько уровней логирования. Для диагностики сетевых проблем наиболее полезны:
| Уровень | Команда | Что показывает |
|---|---|---|
quiet | -loglevel quiet | Ничего (только ошибки) |
error | -loglevel error | Только ошибки |
warning | -loglevel warning | Ошибки и предупреждения |
info | -loglevel info | Статус инициализации, параметры потока (по умолчанию) |
verbose | -loglevel verbose | Подробная информация о пакетах, буферах, PTS/DTS |
debug | -loglevel debug | Максимальная детализация, включая внутренние вызовы |
Рекомендуемая команда для диагностики:
ffmpeg -loglevel verbose -i rtsp://... -c copy output.mp4
или
ffmpeg -loglevel debug -i srt://... -c copy output.ts
⚠️ Внимание: Уровень
debugгенерирует очень большой объём вывода. Используйте его только для кратких тестов и перенаправляйте в файл:ffmpeg -loglevel debug -i rtsp://... -c copy out.mp4 2> debug.log
На что смотреть в подробных логах
При включённом -loglevel verbose или debug FFMPEG начинает выводить информацию, полезную для диагностики:
1. PTS и DTS — временные метки кадров
Пример вывода:
[rtsp @ 0x55a1b2c3d0] DTS 123456, PTS 123456, duration 33 ms
- PTS (Presentation Time Stamp) — время отображения кадра.
- DTS (Decoding Time Stamp) — время декодирования.
Что искать:
- Немонотонные значения — если PTS прыгает вперёд/назад, это может вызвать рывки.
- Большие разрывы — например, от 1000 до 2000 мс — признак потерь или перезапуска потока.
- Отрицательные значения — возможны при старте, но не должны сохраняться долго.
2. Состояние буферов: underrun и overrun
В логах могут встречаться сообщения:
[buffer @ 0x55a1b2c3d0] Buffer underrun, waiting for more data
или
[buffer @ 0x55a1b2c3d0] Buffer overrun, dropping frame
- Underrun — буфер пуст, данных не хватает. Причина: медленная сеть, перегрузка CPU.
- Overrun — буфер переполнен. Причина: данные приходят слишком быстро, FFMPEG не успевает обрабатывать.
Что делать:
- Для underrun: увеличьте буфер (
-rtbufsize 100M) или уменьшите нагрузку. - Для overrun: уменьшите битрейт источника или оптимизируйте кодирование.
3. Статистика приёма пакетов
В режиме verbose FFMPEG может показывать:
[rtsp @ 0x55a1b2c3d0] Received packet of type video, size 1460, seq 1234
[rtsp @ 0x55a1b2c3d0] RTP: missed 5 packets after seq 1234
Это позволяет отследить:
- Частоту потерь.
- Моменты, когда сеть «проседает».
- Соответствие между потерями и артефактами на видео.
Примеры реальных ситуаций и диагностика
Ситуация 1: Камера не отвечает
Симптом: FFMPEG зависает на старте, нет изображения.
Лог:
[tcp @ 0x55a1b2c3d0] Connection to tcp://192.168.1.100:554?timeout=5000000 failed: Connection timed out
Диагностика:
- Проверить
ping 192.168.1.100. - Проверить
telnet 192.168.1.100 554. - Убедиться, что камера включена и настроена.
Решение: Исправить сеть или перезагрузить камеру.
Ситуация 2: RTMP-сервер перегружен
Симптом: Запись идёт, но с обрывами. В логе — buffer overrun.
Лог:
[flv @ 0x55a1b2c3d0] Failed to send packet: Broken pipe
[buffer @ 0x55a1b2c3d0] Buffer overrun, dropping.
Диагностика:
- Сервер не успевает принимать данные.
- Возможно, высокая нагрузка на CPU или сеть.
Решение:
- Увеличить буфер на стороне FFMPEG:
-flvflags nobuffer. - Уменьшить битрейт:
-b:v 2M. - Перейти на SRT с управляемой задержкой.
Ситуация 3: SRT-соединение с недостаточной задержкой
Симптом: Потери пакетов, несмотря на надёжность SRT.
Лог:
[srt @ 0x55a1b2c3d0] SRT: lost packet, seq 12345
Причина: Параметр latency слишком мал для текущего джиттера.
Решение:
-
Увеличить задержку при подключении:
srt://192.168.1.100:7001?mode=caller&latency=200 -
Проверить джиттер сети с помощью
srt-live-transmitилиwireshark.
Заключение: алгоритм диагностики
При возникновении проблем с FFMPEG в сетевой среде рекомендуется следовать такому алгоритму:
- Проверьте доступность источника —
ping,telnet, ONVIF-менеджер. - Запустите FFMPEG с
-loglevel info— посмотрите, доходит ли до стадииInput #0. - Если подключение есть, но поток рвётся — включите
-loglevel verbose. - Ищите в логах:
- Ошибки подключения (401, timeout).
- Потери пакетов (RTP/SRT).
- Переполнение/опустошение буферов.
- Нарушения PTS/DTS.
- Примите меры:
- Настройте аутентификацию.
- Увеличьте буферы (
-rtbufsize,latency). - Перейдите на TCP или SRT.
- Упростите пайплайн (отключите фильтры, транскодирование).
📌 Ключевое правило: FFMPEG — отличный инструмент, но он не может компенсировать нестабильную сеть или неправильно настроенные устройства. Логи помогают понять, где находится узкое место: в сети, в источнике или в самой команде FFMPEG.