如何使用ffmpeg提取视频中的第一帧?

Posted

技术标签:

【中文标题】如何使用ffmpeg提取视频中的第一帧?【英文标题】:How to extract the very first frame of a second in a video using ffmpeg? 【发布时间】:2020-05-18 17:25:27 【问题描述】:

我正在尝试从视频中提取第一帧。我尝试了不同的方法来实现这一点,但我失败了。这里是我试过的命令。

ffmpeg -i input.ts -s 400x222 -q:v 3 -start_number 0 -vf fps=1 %d.jpg

稍后,我尝试使用特定秒的以下命令再次提取帧。这里我提取的是第 210 秒的帧。

ffmpeg -ss 210 -i input.ts -s 300x250 -t 1 -start_number 0 images.%d.jpg

我只想提取第二个的起始帧。假设从那一秒的 0.001 开始。

当我将我的第一个命令提取的 210 秒的帧与第二个命令提取的第一帧进行比较时,它们是完全不同的。

为了以后使用,为了防止冲突,我只想提取原始输入视频的第一帧。我尝试使用 *** 专家过去告诉过的命令here。但是当我运行它时。它只是提取起始帧(只有 1 帧)。

如何每秒提取视频的起始帧?

【问题讨论】:

你想要每秒的第一帧吗?意思是如果你的帧速率是 25 fps,那么你想要每秒 25 帧中的 1 帧,对吗? @Milan 是的。你完全明白了。 【参考方案1】:

试试这个命令:

ffmpeg -i input.mp4 -vf "select=between(mod(n\, 25)\, 0\, 0), setpts=N/24/TB" output-%04d.png

你必须在 between(mod(n\, 25)\, 0\, 0) 中传递你的视频帧率或 fps 我的视频 fps 是 25 所以我通过了 25

如果你的 fps 为 60,那么你必须在 between(mod(n\, 60)\, 0\, 0) 中传递 60

如果您想要每秒的前 5 帧,请使用 between(mod(n\, 25)\, 0\, 4),它会为您提供每秒的前 5 帧。

【讨论】:

对于 VFR 流不可靠。有关通用表达式,请参阅我的回答 here。 @Milan 我试过使用你的命令,但是当我在我的问题中重新运行第二个命令时(即在特定的那一秒再次提取帧),第 0 帧的帧不同。第一个和第二个命令生成的两个帧是不同的。 您还想从视频的特定秒中提取一帧,对吗? @MilanTejani 是的。我希望我的两个命令的第 0 帧应该相同。 @Gyan 有什么解决方案吗?

以上是关于如何使用ffmpeg提取视频中的第一帧?的主要内容,如果未能解决你的问题,请参考以下文章

3分钟提取10000个视频的第一帧图片,node执行ffmpeg万能脚本

如何在视频的第一帧之前放置静止图像?

使用ffmpeg从视频中提取最终帧

如何截取视频的第一帧图片

如何把上传的视频用该视频的第一帧的缩略图显示

如何将视频拆解成图片