ffmpeg:如何将特定时间范围内的关键帧提取到带有原始视频时间戳的文件名中?

问题描述 投票:0回答:1

我有我感兴趣的输入特定时间戳,我希望提取最接近它们的关键帧。因此,我使用

skip_frame nokey
select='between(t,...,...)+between(t,...,...)+...'
每次我感兴趣的时候我都会添加几秒钟(足以让至少一个关键帧根据我拥有的输入视频落在该范围内,然后可以手动如果在我的序列中的给定时间范围内出现多个,则删除)。链接
between()
s 让我可以使用一个命令来提取所有这些图像,以避免从视频的开头寻找每个图像,我是否为每个图像使用单独的命令。所以这部分工作正常。

问题是我希望输出图像文件名对应于输入视频的提取帧的时间戳,以秒为单位(或秒的小数部分,如十分之一或毫秒)。使用旧版本的 ffmpeg,例如,我曾经能够使用

-vsync 0 -r 10 -frame_pts true %05d.webp
以十分之一秒为单位获取输出文件名,但对于最新版本,这会导致错误
One of -r/-fpsmax was specified together a non-CFR -vsync/-fps_mode. This is contradictory.
替换已弃用的
-vsync
-fps_mode
和 CFR 值之一导致 ffmpeg 重复帧以满足指定的
-r
值,这导致大量输出图像。我能够获得我想要的关键帧集并且没有重复的方法是删除
-r
并使用
-fps_mode passthrough
,但随后我丢失了输出文件在原始视频中的时间命名。在这里和网络上的其他地方搜索,我尝试过设置
settb=...,setpts=...
-copyts
之类的东西,但最终无法让它工作。

作为一个完整的例子,命令

ffmpeg -skip_frame nokey -i "input.mp4" -vf "select='between(t,15,25)+between(t,40,50)+between(t,95,105)+between(t,120,130)+between(t,190,200)',scale='min(480,iw)':-2:flags=lanczos" -fps_mode passthrough -copyts -c:v libwebp -quality 75 -preset photo -frame_pts true %05d.webp
为我提供了一组正确的输出图像,但没有提供文件名,这样我就可以轻松地快速手动找到与原始视频中特定时间相对应的帧。

video ffmpeg codec
1个回答
0
投票

设置

-r
的目的是间接设置codec时基。

最近,

-r
行为发生了变化,以便始终生成 CFR 流。

所以,直接设置编解码器时基:

-copyts -fps_mode passthrough -enc_time_base 1/10 -frame_pts true
其值是帧率的倒数。

© www.soinside.com 2019 - 2024. All rights reserved.