Назовите ffmpeg сгенерированные изображения, используя временную метку, а не последовательные числа - PullRequest
3 голосов
/ 03 августа 2011

Насколько я могу судить из документов ffmpeg, они не предоставляют способ использовать временные метки в имени файла, а не последовательные числа. То, что они предоставляют, позволяет создавать 0001.jpg, 0002.jpg, 0003.jpg, но не 2011-08-01 7: 30: 00.jpg, 2011-08-01 7: 30: 01.jpg, 2011-08- 01 7: 30: 02.jpg. Может кто-нибудь придумать решение, которое могло бы взять последовательно именованные файлы из ffmpeg и назвать их, используя время их создания?

Ответы [ 3 ]

6 голосов
/ 15 декабря 2015

По крайней мере, в более новых версиях ffmpeg есть опция strftime, которая позволяет вам делать то, что вы хотите.

Например:

ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg"

Создает файлы, такие как:

2015-11-20_16-25-06.jpg
0 голосов
/ 04 августа 2011

Я запустил этот grep на источнике:

ffmpeg$ fgrep -r snprintf *|grep name
...    
ffmpeg.c:    snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
...

Определенно есть код для генерации имен файлов с датами. Вы можете попробовать запустить вашу команду с опцией -vstats. Возможно, он сгенерирует файл журнала для каждого выходного файла.

К сожалению, код довольно сложный. Я не могу видеть прямо сейчас, где создается имя файла JPEG. Если у вас запущена программа, используйте 'strace', но я слишком ленив для этого.

0 голосов
/ 03 августа 2011

В unixoid системах вы можете использовать find + ImageMagick для определения каждого файла и даты его создания. Обычно ImageMagick должен быть установлен:

find -name "*.jpg" -execdir identify -verbose {} ";" -ls | egrep "(create|^Image)" 
Image: ./logo-text-u-sinn.4.2.do.jpg
    date:create: 2011-08-03T12:16:55+02:00
Image: ./tasten-in-tasse_3919.jpg
    date:create: 2011-06-14T22:37:07+02:00

gnu: find также доступна для Windows, но обычно не распространяется Microsoft. Вместо этого у Microsoft есть собственный, более низкий (afaik) тип поиска (.exe) с совершенно другим синтаксисом.

Так что если вы устанавливаете gnu-find, он должен вызываться по всему пути или, например, переименовываться в gfind, чтобы предотвратить конфликт имен.

Я бы написал маленький скрипт

#!/bin/bash
name=$1 
dt=$(identify -verbose $name grep "create:")
datetime=${dt/*create:/}
mv $name $datetime.jpg 

, который уязвим для имен файлов, включая пробелы, но если ваши файлы всегда имеют имя 0001.jpg и т. Д., Это не будет проблемой.

Сценарий выдаст, например, 2011-08-03T12:39:42+02:00 в качестве имени файла и может быть вызван командой find:

find -name "*.jpg" -execdir ./myscript.sh {} ";"

Если вы не используете / не используете bash, вам необходимо соответствующим образом изменить его.

Внимание:

Вы должны быть осторожны. Если время 2 или более файлов совпадает, они будут переопределены без уведомления. Конечно, вы можете встроить проверку в ваш скрипт, и, возможно, ваша файловая система сможет хранить дату более точно, чем в секундах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...