据我从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获取顺序命名的文件,并使用他们创建的时间命名它们吗?
答案 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',但我太懒了。