Вопрос или проблема
Я собрал статическую версию 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 -
Рекомендации по улучшенной конфигурации
Для оптимального функционирования следует учитывать следующие рекомендации:
-
Порядок аргументов: Всегда ставьте протокол (например,
-rtsp_transport
) перед указанием входного потока-i
. -
Увеличение анализируемого времени и размера проб: Если у вас возникают проблемы с новыми потоками или нестандартными конфигурациями, помимо порядка аргументов, вы также можете попробовать увеличить значения
-analyzeduration
и-probesize
для более глубокого анализа потока. -
Логи и выводы: Проверяйте выводы
ffmpeg
иffprobe
для получения более детальной информации об ошибках. Использование флага-v debug
может помочь в диагностике и выявлении дополнительных проблем.
Заключение
Запуская анализ и обработку RTSP потоков с помощью FFmpeg, убедитесь, что вы соблюдаете правильный порядок аргументов командной строки, чтобы избегать ошибок, связанных с параметрами кодека. Если у вас продолжатся проблемы, обращайте внимание на логи и консольный вывод, чтобы получить больше информации о происходящем с вашим потоком.