我想再次提出这个问题,因为旧的解决方案不再适用于 ffmpeg 6.0,这是由于2023 年 1 月这可以防止同时使用-r
和-vsync
/-fps_mode
参数。
目标是使用文件名或叠加文本与帧图像,在原始视频中识别其准确的(呈现)时间戳,无需任何类型的偏移、清理,并达到用户所需的精度(默认情况下为毫秒)。此外,应该能够分辨出每一帧都已从视频的指定片段中转储并按时间戳顺序排序。其动机是利用视频来计时其中记录的事件的持续时间。
我之前认为可以解决这个问题的命令是:
ffmpeg
-ss 1:23:45
-t 5
-i input.mkv
-copyts
-fps_mode passthrough
-r 1000
-frame_pts 1
%08d.jpg
但显然不再可能-fps_mode
与一起使用-r 1000
。似乎这里隐式使用的 image2 多路复用器默认时间基数为 1,-r 1000
之前曾用于将时间基数缩放为 0.001。我不确定是否-enc_time_base 0.001
会做同样的事情,是否也需要使用-video_track_timescale
或类似方法。我希望理想情况下从源中逐字提取时间戳,可以选择截断(例如精确到毫秒),而不必对 CFR/VFR 等做出假设。所以我想请专业人士检查我是否做得正确。我还想知道如何将这些相同的时间戳叠加在图像本身上,但在让文件名方法起作用之前我还没有研究过它。谢谢。
这是一个Gyan 的回答暗示现在不可能的-vsync
和的混合-r
。
答案1
是的,随后进行了更改以在-r
设置时强制执行 CFR。
-enc_time_base 1/FPS
应该使用。
-video_track_timescale
特定于 MP4/MOV 输出。