我有一个视频文件,时长为 9.3 秒,录制时的 FPS 为 10。我想使用 FFMPEG 以任意 FPS(例如 FPS=3)从此视频中提取帧。示例命令:
ffmpeg -i input.mp4 -filter:v "fps=3" image_index_timestamp.jpg
但是,我需要知道 FFMPEG 从原始视频中提取了哪一帧。我的意思是,我想在文件名中包含一个时间戳(例如image_00_00:00:00.1.jpg
,00
索引是由FFMPEG并且00:00:00.1
是从中提取帧的时间戳。)
我希望能够找到那个特定的时间戳并提取为我生成的SEEK
相同帧。FFMPEG
通过使用以下命令,我能够在每一帧上绘制时间戳(pts)。但是,我需要的是文件名内的时间戳,但我不知道如何获取它。
ffmpeg -i input.mp4 -filter:v "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf: text='%{pts\:hms}': x=(w-tw)/2: y=h-(2*lh): fontcolor=red: box=1: boxcolor=0x00000000@1,fps=3" -start_number 0 image_%03d.jpg
答案1
ffmpeg 文档建议对所有帧添加时间戳- ffmpeg -i 输入.mp4 -f 图像2 -frame_pts true %d.jpg
如果你退房https://ffmpeg.org/ffmpeg-all.html 并搜索“用 pts 扩展文件名”
但我不认为它是真正的演示时间戳,而是一个索引。
答案2
根据关注帖子,我们可以使用以下命令将文件设置为以毫秒为单位的时间戳:
ffmpeg -vsync 0 -i video.mkv -r 1000 -f image2 -frame_pts 1 %d.jpg
-vsync 0
- 每个帧都带有其时间戳,从解复用器传递到复用器。-r 1000
- 将输出的帧速率设置为 1000Hz,以将索引转换为毫秒。-frame_pts 1
- 使用当前帧点作为文件名。
为了将文件名设置为帧速率为 3Hz,我们必须知道原始视频帧速率。
例如,如果原始帧率为 25fps,则使用以下命令:
ffmpeg -vsync 0 -i video.mkv -r 1000*25/3 -f image2 -frame_pts 1 %d.jpg
还有一个使用setpts
过滤器的选项:
ffmpeg -vsync 0 -i video.mkv -vf "setpts=N*333.333" -f image2 -frame_pts 1 -enc_time_base -1 %d.jpg
上述命令将文件名设置为以 333 为步长进行计数。
答案3
根据帖子 如何使用 ffmpeg 提取具有特定 fps 和缩放比例的帧 这可能有效:
ffmpeg -i video.avi -vf "fps=3" frames/c01_%04d.jpeg