FFMPEG:获取视频中每一帧对应的系统时间

FFMPEG : Obtain the system time corresponding to each frame present in a video

我目前正在 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捕获此帧时的系统时间?任何输入都会有所帮助。

使用

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, select 第 X 个条目,添加 15e11 (1500000000000) 然后转换为人类时间戳,例如https://www.epochconverter.com/

Gyan 的回答在 linux 下也有效。我只需要在 filter-complex.

之后围绕长参数 double-quotes