如何用ffmpeg剪切特定视频帧并转换帧速率?

如何用ffmpeg剪切特定视频帧并转换帧速率?

几天以来,我遇到了 ffmpeg 的一个问题,这实际上让我抓狂了...我尝试使用 FFMPEG 的 filter_complex 来提取视频文件(以 60fps 拍摄)的某些短片段。我知道原始素材中我想要用于剪切的确切帧。我使用修剪过滤命令设定点如果我想更改每个片段的速度,则需要执行以下步骤。在实际情况下,我希望第一个片段的速度为原始速度 (1.0),并且生成的输出视频应为 30fps,而不是原始素材的 60fps。这是我使用的代码:

ffmpeg -y -i footage60fps -filter_complex " 
[0:v]trim=start_frame=28:end_frame=82,setpts=PTS-
STARTPTS,setpts=1.0*PTS[v0]; 
[0:v]trim=start_frame=10:end_frame=20,setpts=PTS-
STARTPTS,setpts=2.0*PTS[v1]; [v0][v1]concat=n=2:v=1:a=0[out] " -map [out] -
preset ultrafast -r 30 output30fps.mp4

我期望的结果是,在第一个片段中(第 28 帧直到第 82 帧之前的最后一帧),ffmpeg 将丢弃每隔一帧([x]),以便以正常速度将其从 60fps 转换为 30fps:[28][x][30][x][32][x]...[80]

但是,我得到的结果是: [28][29][30][31][x][33][x][35][x]...[81]

有人了解这种行为吗?我该如何解决?这似乎是一个小问题,但在音乐等内容上切换时,它变得非常烦人……任何帮助都将不胜感激!

答案1

使用

ffmpeg -y -i footage60fps -filter_complex " 
[0:v]trim=start_frame=28:end_frame=82,setpts=PTS-STARTPTS,framestep=2[v0]; 
[0:v]trim=start_frame=10:end_frame=20,setpts=PTS-STARTPTS,setpts=2.0*PTS[v1];
[v0][v1]concat=n=2:v=1:a=0[out]" -map [out] -r 30 -preset ultrafast output30fps.mp4

我还没有研究您所看到的行为的原因,但是当您将不同速率的流与连接过滤器混合,并应用 CFR 速率一致性时,帧丢失的节奏并不总是如预期的那样。

相关内容