当前位置: 首页 > 知识库问答 >
问题:

如何用ffmpeg从H264视频中提取最接近给定帧数的关键帧

燕经国
2023-03-14
Extracting Frames: [40, 59, 73, 110]
/usr/bin/ffmpeg -y -hide_banner -nostats -loglevel error -i /home/pi/movie.mp4 -vf select='eq(n\,40)+eq(n\,59)+eq(n\,73)+eq(n\,110)',scale=640:-1 -vsync 0 /tmp/%04d.jpg
ffmpeg -ss <start_time> -i video.mp4 -t <duration> -q:v 2 -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 0 frame%03d.jpg

这将从start_timestart_time+duration获取所有i帧。

但是我想做的是给出一个帧号列表,并让ffmpeg提取出与每个帧号最接近的关键帧。有没有一种方法可以用ffmpeg来实现这一点,或者我必须在libavcodec上编写自己的程序来实现这一点?

共有1个答案

岑鸣
2023-03-14

如果速度是主要关注点,您可以在demuxer阶段选择跳过非关键帧。

ffmpeg -discard nokey -i video.mp4 -q:v 2 -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 0 frame%03d.jpg

这应该提供20-100倍的速度。

如果需要使用discard选项提取特定半径内的所有关键帧,请使用

ffmpeg -discard nokey -i video.mp4 -q:v 2 -vf select="eq(pict_type\,PICT_TYPE_I)*(lt(abs(t-14),3)+lt(abs(t-107),3)+lt(abs(t-2113),3))" -vsync 0 frame%03d.jpg
 类似资料:
  • 我有一堆从Youtube下载的视频,我想从他们中提取帧。我使用的当前命令是: 但是我还想设置-r和-t选项。我想要的fps是每个视频的fps,持续时间是他们的持续时间。我知道如果我不设置-r选项,默认值是25 fps。

  • 我想提取原始Yuv帧从mp4剪辑使用FFMPEG。我输入。mp4告诉我视频格式是YUV420P10LE。我使用以下命令来提取帧: 以下是FFMPEG的日志:

  • 我想要做的是在第三分钟提取“最近”的关键帧--因为通常情况下,我用当前成功的代码提取的帧不是关键帧,因此模糊。 我知道有一种方法可以提取FFMPEG中的所有关键帧,但是有没有一种方法可以提取视频中最接近特定时间的关键帧呢?

  • 我正在尝试提取几个视频上的所有帧。这些视频是在以可变帧速率保存输出的摄像机上拍摄的,因此,一些帧在时间上比其他帧更接近(根据mediainfo,每秒27到30帧) 这些帧将与一些元数据同步,因此我不仅需要提取它们,还需要保留视频每帧拍摄的[相对]时间信息。 我一直在使用ffmpeg来提取视频帧,当视频帧速率不再恒定时,挑战就来了。任何其他不同于ffmpeg的方法或程序都可以完成任务。