ffmpeg захватывает текущий кадр и перезаписывает выходной файл изображения
Я пытаюсь извлечь файл изображения из URL-адреса потока RTSP каждую секунду (может быть также каждые 1 минуту) и перезаписать этот файл изображения.
мой код ниже работает, но выводит несколько файлов JPG изображений: img1.jpg, img2.jpg, img3.jpg...
ffmpeg -i rtsp://IP_ADDRESS/live.sdp -f image2 -r 1 img%01d.jpg
Как использовать сценарии ffmpeg или, возможно, bash в Linux, чтобы перезаписать один и тот же файл изображения при непрерывном извлечении изображения с НЕ высокой частотой, скажем, 1 минута или 10 секунд?
5 ответов
Следующая командная строка должна работать для вас.
ffmpeg -i rtsp://IP_ADDRESS/live.sdp -f image2 -updatefirst 1 img.jpg
Чтобы уточнить немного о уже принятом ответе от pragnesh,
FFmpeg
Как указано в документации ffmpeg: параметры командной строки ffmpeg задаются как
ffmpeg [global_options] {[input_options] -i input_file} ... {[output_options] output_file} ...
Так
ffmpeg -i rtsp://<rtsp_source_addr> -f image2 -update 1 img.jpg
Использует параметр вывода -f image2, принудительно выводит формат вывода в формат image2, как часть этапа мультиплексора.
Обратите внимание, что в ffmpeg, если в имени выходного файла указан формат изображения, по умолчанию будет использоваться мультиплексор image2, поэтому команду можно сократить до:
ffmpeg -i rtsp://<rtsp_source_addr> -update 1 img.jpg
Мультиплексор формата image2 ожидает шаблон имени файла, такой как img%01d.jpg
для создания последовательно пронумерованных серий файлов. Если опция обновления установлена в 1, имя файла будет интерпретироваться как просто имя файла, а не как шаблон, тем самым перезаписывая тот же файл.
Используя опцию -r, установить частоту кадров, опция видео работает, но я сгенерировал много пропущенных кадровых сообщений, которые меня беспокоили.
Благодаря другому ответу на ту же тему я обнаружил, что фильтр видео fps работает лучше.
Так что моя версия рабочей команды
ffmpeg -i rtsp://<rtsp_source_addr> -vf fps=fps=1/20 -update 1 img.jpg
По какой-то причине мне все еще неизвестно, минимальная частота кадров, которую я могу достичь с помощью своего канала, составляет 1/20 или 0,05.
Также существует миниатюра видеофильтра, которая выбирает изображение из ряда кадров, но это более интенсивно обрабатывает, и поэтому я бы не рекомендовал его.
Большую часть этого и многого другого я нашел в онлайн-документации FFMpeg
AVconv
Для тех из вас, кто использует avconv, это очень похоже. Они ведь вилки того, что когда-то было обычной библиотекой. Документация AVconv image2 находится здесь.
avconv -i rtsp://<rtsp_source_addr> -vf fps=fps=1/20 -update 1 img.jpg
Как указал Xianlin, возможно, есть еще несколько интересных вариантов:
-an: отключить запись звука.
- Найдено в разделе "Параметры звука"
-r
- Найдено в разделе параметров видео
- используется в качестве параметра вывода на самом деле является заменой фильтра FPS
приводя к альтернативной версии:
avconv -i rtsp://<rtsp_source_addr> -r 1/20 -an -update 1 img.jpg
Надеюсь, это поможет понять возможную дальнейшую настройку;)
Я не мог заставить работать опцию -update, чтобы перезаписать.jpg. Проведение некоторых экспериментов привело к рабочему решению (по крайней мере, для меня) с опцией -y в конце (верхний регистр не работает). Мне также понадобился http:// вместо rstp:// для этой камеры.
ffmpeg -i http://xx:yy@192.168.1.xx:yyy/snapshot.cgi /tmp/Capture2.jpg -y
Получайте снимок из видеопотока RTSP каждые 10 секунд.
#!/bin/bash
#fetch-snapshots.sh
url='rtsp://IP_ADDRESS/live.sdp'
avconv -i $url -r 0.1 -vsync 1 -qscale 1 -f image2 images%09d.jpg
-r скорость установить частоту кадров 0,1 кадра в секунду (это равняется 1 кадру каждые 10 секунд). Благодаря westonruter, см. https://gist.github.com/westonruter/4508842
Кроме того, взгляните на FFMPEG: извлечение 20 изображений из видео переменной длины
ffmpeg -i rtsp://root: [электронная почта защищена] /mpeg4 -ss 00:00:01 -f image2 -vframes 1 thumb.jpg
- замените URL-адресом вашего протокола rtsp
- убедитесь 00:00:01
- если поставить другие цифры, то изображение вылетит