使用时间戳而不是序列号命名ffmpeg生成的图像

时间:2011-08-03 18:55:17

标签: ffmpeg filenames

据我从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 个答案:

答案 0 :(得分:6)

至少较新版本的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

答案 1 :(得分:0)

在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分发。相反,微软有自己的,低级(afaik)类型的find(.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个或更多文件的时间相同,则将以静默方式覆盖它们。当然,您可以对您的脚本进行检查,也许您的文件系统可以存储比秒间隔更精确的日期。

答案 2 :(得分:0)

我在源代码上运行了这个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',但我太懒了。