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
我目前正在 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