如何获取使用ffmpeg
获取的提取图像的时间戳?将什么选项传递给ffmpeg
命令?
我正在使用的当前命令是:
ffmpeg -i video.mp4 -vf select='gt(scene\,0.3)' -vsync 0 -an keyframes%03d.jpg
答案 0 :(得分:1)
选项可以是使用drawtext
video filter直接在每个帧上写入时间戳。
在Windows机器上,使用Zeranoe ffmpeg软件包,您可以输入:
ffmpeg -i video.mp4 -vf "drawtext=fontfile=/Windows/Fonts/Arial.ttf: timecode='00\:00\:00\:00': r=25: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1: fontsize=30" tmp/frame%05d.jpg" -vsync 0 -an keyframes%03d.jpg
该命令将在每帧的下半部分转储帧时间戳,并以秒分辨率。
请查看here以获取有关如何为ffmpeg设置字体环境变量的信息。
答案 1 :(得分:0)
在场景变化时提取帧并获取特定帧的时间。可能会对以下行有所帮助:
ffmpeg -i image.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames%05d.jpg >& output.txt
您将获得如下输出:[Parsed_showinfo_1 @ 0x25bf900] n:0分:119357 pts_time:9.95637 pos:676702 .....你需要按照命令提取该运行的pts_time。
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep '[0-9]*\.[0-9]*' -o > timestamps
使用上述命令,您将找到以下内容:
9.95637
9.98974
15.0281
21.8016
28.208
28.4082
答案 2 :(得分:0)
由于这个问题是在python中标记的,因此我想为Python开发人员添加以下解决方案:
from subprocess import check_output
import re
pts = str(check_output('ffmpeg -i video.mp4 -vf select="eq(pict_type\,I)" -an -vsync 0 keyframes%03d.jpg -loglevel debug 2>&1 |findstr select:1 ',shell=True),'utf-8') #replace findstr with grep on Linux
pts = [float(i) for i in re.findall(r"\bpts:(\d+\.\d)", pts)] # Find pattern that starts with "pts:"
print(pts)
答案 3 :(得分:0)
@DeWil 的回答的一个小更新(抱歉无法评论,因为我没有足够的声誉)。 下面的答案通过与时间戳“t:”而不是“pts:”的正则表达式匹配来给出适当的时间戳。
from subprocess import check_output
import re
pts = str(check_output('ffmpeg -i input.mp4 -vf select="eq(pict_type\,I)" -an -vsync 0 keyframes%03d.jpg -loglevel debug 2>&1 |findstr select:1 ',shell=True),'utf-8') #replace findstr with grep on Linux
pts = [float(i) for i in re.findall(r"\bt:(\d+\.\d)", pts)] # Find pattern that starts with "t:"
print(pts)