【问题标题】:ffmpeg output images filename with time positionffmpeg 输出图像文件名和时间位置
【发布时间】:2018-10-10 12:15:40
【问题描述】:

我正在使用 ffmpeg 使用以下命令以特定速率(每 5 秒一个屏幕截图)从我的视频中获取一些 jpg:

ffmpeg -i source -f image2 -r 1/5 %d.jpg

这可行,并给我顺序文件名:

1.jpg
2.jpg
3.jpg
4.jpg

如果我需要知道这些屏幕截图的拍摄时间怎么办?类似时间戳的东西:

00:00:00.0000.jpg
00:00:05.0000.jpg
00:00:10.0000.jpg
00:00:15.0000.jpg

或秒数:

0.jpg
5.jpg
10.jpg
15.jpg

我再次尝试使用新的-frame_pts 选项:

ffmpeg -i source -f image2 -r 1/5 -frame_pts 1 %d.jpg

我得到了类似的顺序文件名,但现在它们从零开始:

0.jpg
1.jpg
2.jpg
3.jpg

【问题讨论】:

    标签: ffmpeg jpeg screenshot filenames frame


    【解决方案1】:

    使用

    ffmpeg -i source -vf fps=1,select='not(mod(t,5))' -vsync 0 -frame_pts 1 z%d.jpg
    

    frame_pts 将为图像名称分配一个序列号,其中数字代表根据输出时基的帧位置。所以计算出来的时间位置是frame # x timebase。时基是输出帧率的倒数,例如对于 12 fps 流,时基为 1/12。所以输出文件image212代表时间为212 x 1/12 = 17.67s

    要表示秒,您需要生成一个 1 fps 的流,然后每 5 帧选取一次,以从每 5 秒获取一帧。添加vsync 0是为了防止ffmpeg复制帧以生成恒定帧率流。

    【讨论】:

    • 如果帧率可变怎么办?这里的计算假设帧速率是恒定的,并且只是将帧索引除以帧速率。假设帧速率不是恒定的,有没有办法获得每帧的实际时间戳?
    • 是否可以只指定时间戳作为文件名?
    【解决方案2】:

    这可能不是最好的解决方案,但它确实有效

    for (i = 0; i < $duration; $i += 0.5) { //where $duration is video duration 
       `ffmpeg -y -i video.mp4 -ss $i -vframes 1 $i.jpg`
    }
    

    当然,这会非常慢,因为它会为每一帧生成 ffmpeg,但正如我所说的,这可能会帮助您完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2018-06-15
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2022-07-16
      相关资源
      最近更新 更多