我目前正在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捕获此帧时,是否有办法获取系统时间?任何输入都会有所帮助。
答案 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/