提取帧时间戳(PTS)并将其设置为文件名

提取帧时间戳(PTS)并将其设置为文件名

我有一个视频文件,时长为 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.jpg00索引是由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

相关内容