首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FFMPEG:如何从视频文件中提取每2帧i帧

FFMPEG:如何从视频文件中提取每2帧i帧
EN

Stack Overflow用户
提问于 2022-11-27 06:19:41
回答 2查看 56关注 0票数 1

我正在寻找一种方法提取每一秒(第二)i-帧使用ffmpeg,并保存作为一个新的时间间隔视频。

到目前为止,我通过以下命令保存了所有i帧:

ffmpeg -i $FILE -vf "select='eq(pict_type,I)',setpt=N/FRAME_RATE/TB“-r 29.97 -vcodec libx264 -b:v 62M -an ./enc/${FILE}_cnv.mp4

但我需要减少两倍的I-帧的结果视频。例如,如果原始视频中的i帧是1-8-16-24-32-40.,我只需要1-16-32-48.有没有一种方法可以不制作带有所有关键帧的临时视频来提取它们?

更新:由于没有找到通用解决方案,我决定使用:-vf "select='eq(pict_type,i)* no (mod(n,16))‘,setpts=N/FRAME/TB“进行欺骗。

EN

Stack Overflow用户

发布于 2022-11-27 07:13:24

乍一看,您应该可以在筛选器中使用第二步来选择偶数或奇数i帧,但经过测试后,这似乎是不可能的。

在查看帧号时,我们有两个选择:n (似乎是绝对帧号)和selected_n (似乎是过滤的帧号)。对于如何定义这些值,ffmpeg过滤器文档并不十分清楚。

在我的测试中,如果您使用这样的过滤器:

代码语言:javascript
运行
复制
select='eq(pict_type,I)*not(mod(n,2))'

如果省略了*not(mod(n,2)),您将得到相同的帧数,我假设这是因为由于编码的工作方式,我的帧总是落在奇数n上。

但是,如果我们尝试使用selected_n,我发现只有一个帧被选中。这是有意义的,因为过滤器永远不能匹配偶数选定的帧,所以它将永远只匹配第一个。

鉴于此,我认为您唯一的选择是使用两阶段的方法,使用一次运行的ffmpeg获得您的iframes,然后第二次运行ffmpeg来删除所有其他帧。类似于:

代码语言:javascript
运行
复制
ffmpeg -i $FILE -vf "select='eq(pict_type,I)' $TMPFILE
ffmpeg -i $TMPFILE -vf "select='not(mod(n,2))' $CONVERTED_FILE
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74587943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档