ffmpeg在搜索PICT_TYPE_I关键帧后转储特定长度的视频

ffmpeg在搜索PICT_TYPE_I关键帧后转储特定长度的视频,ffmpeg,seek,Ffmpeg,Seek,我有一个flv视频,想在第一个关键帧PICT\u TYPE\u I后转储视频的长度3s在00:39后见面。我准备好了ffmpeg seeking,并在这里引用 ffmpeg-ss 00:23:00-i Mononoke.Hime.mkv-frames:v1 out1.jpg 此示例将在同一时间生成一个图像帧(out1.jpg) 电影开始后23分钟。输入将是 使用关键帧解析,速度非常快。从FFmpeg 2.1开始,当 使用ffmpeg进行转码(即不仅仅是流复制),-ss现在是 即使用作输入选项,也

我有一个flv视频,想在第一个关键帧
PICT\u TYPE\u I
后转储视频的长度
3s
00:39
后见面。我准备好了
ffmpeg seeking
,并在这里引用

ffmpeg-ss 00:23:00-i Mononoke.Hime.mkv-frames:v1 out1.jpg

此示例将在同一时间生成一个图像帧(out1.jpg) 电影开始后23分钟。输入将是 使用关键帧解析,速度非常快。从FFmpeg 2.1开始,当 使用ffmpeg进行转码(即不仅仅是流复制),-ss现在是 即使用作输入选项,也“帧精确”。以前的 行为(仅查找最近的前一个关键帧,即使没有 精确)可以使用-noaccurate_seek选项恢复

所以我认为如果我使用这个命令(将
-ss
放在
-I
之前)

这应该转储一个持续时间
3.12s
的视频,并从
00:39
之后的第一个
关键帧开始,对吗?毕竟,这是我需要的

但结果是
dump。flv
不是以
关键帧开始的,即
PICT\u TYPE\u I


我知道我可以使用
ffprobe
找到所有
关键帧
开始时间,并重新计算
-ss
搜索时间以实现此目的。但是有更好的方法吗?

如果音频不重要,您可以使用

ffmpeg -ss 39.00 -i in.flv -vf select='if(eq(pict_type,I),st(1,t),gt(t,ld(1)))',setpts=N/FRAME_RATE/TB -an -t 3.12 out.flv
这里,“选择”过滤器将丢弃搜索点之后第一个关键帧之前的所有帧。
t
值控制所选的总持续时间


请注意,视频持续时间是量化的,即25 fps视频的持续时间可以是0.04秒。

您也有音频吗?没有,音频没有问题
ffmpeg -ss 39.00 -i in.flv -vf select='if(eq(pict_type,I),st(1,t),gt(t,ld(1)))',setpts=N/FRAME_RATE/TB -an -t 3.12 out.flv