FFMPEG:获取与视频中存在的每个帧相对应的系统时间

时间:2018-11-20 10:38:21

标签: video ffmpeg duplicates timestamp video-capture

我目前正在Windows 10系统上使用以下命令记录屏幕,

ffmpeg.exe -loglevel quiet -f gdigrab -framerate 30 -i desktop -vf mpdecimate,setpts=N/FRAME_RATE/TB -vcodec libx264 -pix_fmt yuv420p -preset slow -crf 0 -threads 0 nodups.mkv

如果我录制了5分钟的视频,其中4分钟是空闲的。最终获得的视频只有1分钟。我想从这1分钟的视频中了解与特定帧相对应的系统时间。 我尝试使用该命令从第1分钟视频获得第40帧的帧信息,例如:ffmpeg -i nodups.mkv -vf select='eq(n,40)',showinfo -f null - 输出我

[Parsed_showinfo_1 @ 000002455fce5dc0] n:   0 pts:   1333 pts_time:1.333   pos:   158601 fmt:yuv420p sar:0/1 s:1600x900 i:P iskey:0 type:P checksum:885ECCE2 plane_checksum:[7D89AD8E DC745BDC 0E23C369] mean:[158 128 128] stdev:[101.7 4.5 4.0

当使用FFMPEG捕获此帧时,是否有办法获取系统时间?任何输入都会有所帮助。

1 个答案:

答案 0 :(得分:2)

使用

ffmpeg.exe -f gdigrab -framerate 30 -i desktop -filter_complex settb=1/1000,setpts=RTCTIME/1000-1500000000000,mpdecimate,split[out][ts];[out]setpts=N/FRAME_RATE/TB[out] -map [out] -vcodec libx264 -pix_fmt yuv420p -preset fast -crf 0 -threads 0 nodups.mkv -map [ts] -f mkvtimestamp_v2 nodups.txt -vsync 0

FFmpeg支持一种称为mkvtimestamp_v2的数据格式,该格式将时间戳存储为毫秒级的文本。因此,在上面的命令中,首先使用settb将输入的时间戳转换为毫秒精度,然后使用setpts将挂钟时间分配给每个帧。但是因为文本格式的精度有限,所以我们需要减少时间戳。这是通过减去15e11来完成的。在mpdecimate之后,我们分割结果,发送一份用于编码,一份用于元数据输出。

nodups.txt看起来像这样

# timecode format v2
42721944800
42721944867
42721944933
42721945200
...

对于编号X,选择第X个条目,添加15e11(1500000000000),然后从中转换为人工时间戳。 https://www.epochconverter.com/