当前位置: 首页 > 知识库问答 >
问题:

使用fps过滤器的ffmpeg时间戳信息与ff探测不一致

乐正秦斩
2023-03-14

我正在使用ffmpeg从视频中使用过滤器fps提取图像(缩略图),以便每0.5秒获得一幅图像。这是我使用的命令:

ffmpeg -i video.mp4 -f image2 -filter:v fps=1/0.5 -y out_%3d.png

我想知道这些图像的时间戳,我发现ffmpeg的行为与ffprobe不同。

首先,我还没有找到一种方法将时间戳作为元数据(日志文件或其他),但我必须使用ffmpeg在图像中覆盖时间戳:

ffmpeg -i video.mp4 \
-vf "fps=fps=1/5,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf: text='%{pts\:hms}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1" \
out_with_timestamp_%03d.png

但是,使用ffprobe可以模拟使用相同的fps过滤器,ffprobe允许您从帧中获取一些信息。此命令应模拟ffmpeg one,并提供一些元数据,您可以从中提取时间戳:

fprobe -hide_banner \
-i "movie=video.mp4,fps=fps=1/0.5[out0]" \
-f lavfi -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

问题是ffmpeg打印到图像中的时间戳不同于ff探针给出的时间戳,而ffmpeg给出的时间戳是正确的。
ffmpeg给出的时间戳在时间段的中间ff探针给出的那些是在窗口的最开始。

有没有办法使用ffmpeg从视频中提取缩略图及其时间戳?

您可以在此处找到复制此行为的所有步骤:https://www.joseoc.com/en/video/ffmpeg/extract-images-from-video/#getting-图像的时间戳

共有1个答案

颜均
2023-03-14

ffmpeg和ffprobe产生相同的时间戳。

但是,您希望知道源时间戳,之后必须为其应用fps过滤器。fps过滤器所做的是从源流中删除和/或复制帧,以生成恒定帧速率输出。它还以给定的速率重新生成平滑的时间戳。因此,您必须更早地绘制文本以压印源TS。

这里有一个粗略的变通方法来让源TS归档。

ffmpeg -i video.mp4 -vf "showinfo,fps=fps=1/5,showinfo" out_%03d.png 2> showinfo.log

showinfo。日志,将有这样的行

[Parsed_showinfo_0 @ 000000000051fe40] n:  56 pts:  28672 pts_time:2.33333 pos:   159155 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:P checksum:E16BA92B plane_checksum:[DDD39061 7EA5EE0E B9642AAD] mean:[188 113 134 ] stdev:[35.2 24.8 6.3 ]
[Parsed_showinfo_0 @ 000000000051fe40] n:  57 pts:  29184 pts_time:2.375   pos:   161402 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:P checksum:A363FB5E plane_checksum:[9BBF72F4 87165D47 ADB32B23] mean:[188 113 134 ] stdev:[35.3 24.7 6.3 ]
[Parsed_showinfo_0 @ 000000000051fe40] n:  58 pts:  29696 pts_time:2.41667 pos:   173158 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:B checksum:5EE879C4 plane_checksum:[55EA6029 A578E90A 4F463082] mean:[188 113 134 ] stdev:[35.3 24.6 6.3 ]
[Parsed_showinfo_0 @ 000000000051fe40] n:  59 pts:  30208 pts_time:2.45833 pos:   170104 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:B checksum:EE8A0C3A plane_checksum:[A90276D4 620C6744 F5012E13] mean:[188 114 134 ] stdev:[35.4 24.5 6.3 ]
[Parsed_showinfo_0 @ 000000000051fe40] n:  60 pts:  30720 pts_time:2.5     pos:   175138 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:B checksum:8E112769 plane_checksum:[9A02FB68 1FF2EC88 1E573F5B] mean:[188 114 134 ] stdev:[35.5 24.4 6.3 ]
[Parsed_showinfo_2 @ 0000000004947540] n:   0 pts:      0 pts_time:0       pos:   170104 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:B checksum:EE8A0C3A plane_checksum:[A90276D4 620C6744 F5012E13] mean:[188 114 134 ] stdev:[35.4 24.5 6.3 ]
[Parsed_showinfo_0 @ 000000000051fe40] n:  61 pts:  31232 pts_time:2.54167 pos:   164026 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:P checksum:BB465233 plane_checksum:[EAEAE802 57E310BE 62275964] mean:[187 114 134 ] stdev:[35.7 24.4 6.3 ]
[Parsed_showinfo_0 @ 000000000051fe40] n:  62 pts:  31744 pts_time:2.58333 pos:   187333 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:B checksum:9D4E3B24 plane_checksum:[D5D19959 05A4FDBE 88B7A3EF] mean:[187 114 134 ] stdev:[35.8 24.4 6.3 ]

对于每个Parsed_showinfo_2行,必须提取Parsed_showinfo_0行,其pos相同。Parsed\u showinfo\u 0中的pts\u time是您的源TS。

 类似资料:
  • 问题内容: 我有带有Timestmap类型的版本控制字段的表。现在,我试图通过该字段进行搜索查询,但是当我以另一种方式传递参数时: 它将它作为DateTime传递给sql查询。还尝试了NHibernateUtil.Binary,但是nhibernate将其作为varbinary传递。 问题答案: NHibernate TimestampType指定: 该类型与DateTime几乎完全相同,但可以在

  • FPS定义为每秒的帧数。但当我尝试使用总帧数/持续时间计算FPS时,得到的数字与ffmpeg中显示的FPS略有不同: 为了这个视频http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4 使用ffmpeg,我们可以获得其FPS、持续时间和总帧数: ffprobe-选择\u streams v-

  • 如何使用ffmpeg/ffprobe从视频中检索每个关键帧信息。 我已经阅读了很多与此相关的问题和答案,但该命令仅返回关键帧持续时间。 我已使用此命令提取关键帧持续时间 但是我需要从每个关键帧中得到的信息是 1-视频字节大小的字节偏移量 2-关键帧的持续时间 谢谢!

  • 它以名称camera0-00001.jpg,camera0-00002.jpg等保存我的文件。 然后我根据修改后的文件时间,用camera0-HH-mm-ss-(1-30).jpeg重命名我的文件。 所以最后我有4个相同时间和相同帧的文件,像这样:camera0-12-00-00-1.jpeg camera1-12-00-00-1.jpeg camera2-12-00-00-1.jpeg came

  • 我想通过Github将我的discord机器人添加到Heroku主机中,并在Github中添加了我需要的所有内容。 A<规范>要求。txt