FFmpeg/RTSP/h264 – Не удалось найти параметры кодека для потока 0

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

Я собрал статическую версию FFmpeg для захвата кадра из RTSP потока (с камеры Hikvision) в изображение. Поток идет по TCP и его можно воспроизвести с помощью VLC, но у меня возникают проблемы с FFmpeg, так как ffmpeg всегда завершает работу с ошибкой Не удалось найти параметры кодека для потока 0.

Я пробовал -analyzeduration 10M -probesize 10M, но это не помогло.

Есть ли способ решить эту проблему?

Моя конфигурация x264:

--disable-opencl

Моя конфигурация FFmpeg:

--disable-everything --disable-autodetect --enable-pic --enable-static --enable-gpl --enable-version3 --enable-libx264 --enable-demuxer=hls --enable-demuxer=rtsp --enable-demuxer=h264 --enable-decoder=h264 --enable-parser=h264 --enable-encoder=mjpeg --enable-muxer=image2 --enable-protocol=pipe --enable-protocol=tcp --enable-protocol=http --enable-decoder=aac --enable-parser=aac --enable-protocol=file --enable-protocol=udp --enable-protocol=rtmp

ffprobe периодически удается декодировать кадр:

[pairman@pairface ffmpeg-7.1]$ ./ffprobe rtsp://**.**.**.56:554/pag://**.**.**.50:7302:009422:0:MAIN:TCP?streamform=rtp -rtsp_transport tcp
ffprobe version 7.1 Copyright (c) 2007-2024 разработчиков FFmpeg
  построен с помощью gcc 14 (GCC)
  конфигурация: --arch=x86_64 --target-os=linux --prefix=/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target --pkg-config-flags=--static --extra-cflags="-I/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target/include -Os" --extra-cxxflags="-I/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target/include -Os" --extra-ldflags="-L/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target/lib -Wl,-s " --extra-libs="-lpthread -lm" --extra-ldexeflags=-static --bindir=/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/bin --disable-manpages --disable-doc --disable-everything --disable-autodetect --enable-pic --enable-static --enable-gpl --enable-version3 --enable-libx264 --enable-demuxer=hls --enable-demuxer=rtsp --enable-demuxer=h264 --enable-decoder=h264 --enable-parser=h264 --enable-encoder=mjpeg --enable-muxer=image2 --enable-protocol=pipe --enable-protocol=tcp --enable-protocol=http --enable-decoder=aac --enable-parser=aac --enable-protocol=file --enable-protocol=udp --enable-protocol=rtmp
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.100 / 61. 19.100
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
[h264 @ 0xd5de000] ссылается на несуществующий PPS 0
    Последнее сообщение повторено 1 раз
[h264 @ 0xd5de000] ошибка decode_slice_header
[h264 @ 0xd5de000] нет кадра!
[h264 @ 0xd5de000] ссылается на несуществующий PPS 0
    Последнее сообщение повторено 1 раз
[h264 @ 0xd5de000] ошибка decode_slice_header
[h264 @ 0xd5de000] нет кадра!
[h264 @ 0xd5de000] ссылается на несуществующий PPS 0
    Последнее сообщение повторено 1 раз
[h264 @ 0xd5de000] ошибка decode_slice_header
[h264 @ 0xd5de000] нет кадра!
Ввод #0, rtsp, из 'rtsp://**.**.**.56:554/pag://**.**.**.50:7302:009422:0:MAIN:TCP?streamform=rtp':
  Метаданные:
    заголовок         : HIK Media Server V3.5.54
    комментарий         : Описание сессии HIK Media Server : стандарт
  Продолжительность: Н/Д, начало: 0.000000, битрейт: Н/Д
  Поток #0:0: Видео: h264 (Baseline), yuvj420p(pc, bt709, прогрессивное), 1920x1080, 25 tbr, 90k tbn
  Поток #0:1: Аудио: aac (LC), 48000 Hz, стерео, fltp

Но ffmpeg не удается (нажмите здесь для подробного вывода):

[pairman@pairface ffmpeg-7.1]$ ./ffmpeg -i rtsp://**.**.**.56:554/pag://**.**.**.50:7302:009422:0:MAIN:TCP?streamform=rtp -rtsp_transport tcp -an -vframes 1 -f image2 -
ffmpeg version 7.1 Copyright (c) 2000-2024 разработчиков FFmpeg
  построен с помощью gcc 14 (GCC)
  конфигурация: --arch=x86_64 --target-os=linux --prefix=/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target --pkg-config-flags=--static --extra-cflags="-I/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target/include -Os" --extra-cxxflags="-I/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target/include -Os" --extra-ldflags="-L/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/target/lib -Wl,-s " --extra-libs="-lpthread -lm" --extra-ldexeflags=-static --bindir=/home/pairman/Downloads/bw/Xdcheckin-FFmpeg/bin --disable-manpages --disable-doc --disable-everything --disable-autodetect --enable-pic --enable-static --enable-gpl --enable-version3 --enable-libx264 --enable-demuxer=hls --enable-demuxer=rtsp --enable-demuxer=h264 --enable-decoder=h264 --enable-parser=h264 --enable-encoder=mjpeg --enable-muxer=image2 --enable-protocol=pipe --enable-protocol=tcp --enable-protocol=http --enable-decoder=aac --enable-parser=aac --enable-protocol=file --enable-protocol=udp --enable-protocol=rtmp
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.100 / 61. 19.100
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
[rtsp @ 0x32784e80] Не удалось найти параметры кодека для потока 0 (Видео: h264, нет): не указанный размер
Рассмотрите возможность увеличения значения для опций 'analyzeduration' (0) и 'probesize' (5000000)
Ввод #0, rtsp, из 'rtsp://**.**.**.56:554/pag://**.**.**.50:7302:009422:0:MAIN:TCP?streamform=rtp':
  Метаданные:
    заголовок         : HIK Media Server V3.5.54
    комментарий         : Описание сессии HIK Media Server : стандарт
  Продолжительность: Н/Д, битрейт: Н/Д
  Поток #0:0: Видео: h264, нет, 90k tbr, 90k tbn
  Поток #0:1: Аудио: aac, 48000 Hz, стерео, fltp
Выход #0, image2, в 'pipe:':
[out#0/image2 @ 0x3280c280] Выходной файл не содержит потоков
Ошибка открытия выходного файла -.
Ошибка открытия выходных файлов: Недопустимый аргумент

В конце концов, я нашел проблему. ffprobe кажется, не учитывает порядок параметров, в то время как ffmpeg это делает. Для ffmpeg параметр -rtsp_transport должен быть размещен перед -i.

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

Решение проблемы с FFmpeg и RTSP: Не удается найти параметры кодека для потока 0

Когда вы работаете с FFmpeg для обработки RTSP потоков, особенно в контексте видеонаблюдения с камер, таких как Hikvision, может возникнуть ошибка: "Не удается найти параметры кодека для потока 0". Это сообщение об ошибке может быть весьма разочаровывающим, так как вы можете потратить время на попытки изменить параметры, не зная, что проблема заключается в порядке предоставления аргументов.

Подробности проблемы

Ваша цель состоит в том, чтобы захватить кадр из RTSP потока и сохранить его как изображение. Вы указали, что поток успешно воспроизводится в VLC, однако при использовании FFmpeg вы сталкиваетесь с ошибками, связанными с отсутствием параметров кодека. Даже превышение стандартного анализа (-analyzeduration) и размера буфера (-probesize) не решило проблему.

Анализ ситуации

После подготовки конфигурации FFmpeg и запуска команды вы получили сообщение:

Could not find codec parameters for stream 0 (Video: h264, none): unspecified size

Это указывает на то, что FFmpeg не может правильно определить параметры видео потока. Ваша команда ffprobe иногда удается извлечь информацию, но не дает консистентного результата, так как вы получаете сообщения об ошибках в декодере H.264, такие как:

  • non-existing PPS 0 referenced
  • decode_slice_header error

Это означает, что FFmpeg не может найти необходимые параметры (например, Sequence Parameter Set (SPS) и Picture Parameter Set (PPS)), поэтому он не может декодировать видео.

Решение проблемы

На этапе, когда вы пытались выполнить захват кадра, одна из причин, по которой ffmpeg не удается определить параметры кодека, заключалась в неправильном порядке аргументов командной строки. В отличие от ffprobe, для ffmpeg порядок аргументов имеет значение. Аргумент -rtsp_transport должен находиться перед указанием -i.

Вот правильный пример команды:

./ffmpeg -rtsp_transport tcp -i rtsp://**.**.**.56:554/pag://**.**.**.50:7302:009422:0:MAIN:TCP?streamform=rtp -an -vframes 1 -f image2 -

Рекомендации по улучшенной конфигурации

Для оптимального функционирования следует учитывать следующие рекомендации:

  1. Порядок аргументов: Всегда ставьте протокол (например, -rtsp_transport) перед указанием входного потока -i.

  2. Увеличение анализируемого времени и размера проб: Если у вас возникают проблемы с новыми потоками или нестандартными конфигурациями, помимо порядка аргументов, вы также можете попробовать увеличить значения -analyzeduration и -probesize для более глубокого анализа потока.

  3. Логи и выводы: Проверяйте выводы ffmpeg и ffprobe для получения более детальной информации об ошибках. Использование флага -v debug может помочь в диагностике и выявлении дополнительных проблем.

Заключение

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

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

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