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 : устанавливает частоту кадров

приводя к альтернативной версии:

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
  • если поставить другие цифры, то изображение вылетит
Другие вопросы по тегам