到目前为止,我已经拼凑了以下命令:
ffmpeg -i input.mp4 -filter_complex "\
[0:v]trim=start=175.2:end=200.9,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=start=175.2:end=200.9,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=start=214.3:end=324,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=start=214.3:end=324,asetpts=PTS-STARTPTS[a2]; \
[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
提取剪辑并将它们连接成一个视频效果很好。但是,此命令将视频重新编码为 25fps,如警告所示:
[fc#0 @ 0000029e38732840] [vo0->#0:0 @ 0000029e38739b80] 没有有关输入帧速率的信息。回落到默认值 25fps。如果您想要不同的帧速率,请使用 -r 选项。
我希望它保持原始视频的帧速率,无论它是什么,而不是通过丢弃或插入帧来更改帧速率。如果我使用多个输入文件,我希望它只使用第一个文件的帧速率(因为无论如何它们都会相同)。
我该如何实现这一目标?
看起来像是 FFmpeg 7.0 版本中的一个错误
我们可以通过添加
-fps_mode passthrough
参数来修复它。根据文档:
测试:
创建合成 5fps 视频文件(用于测试):
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=5 -f lavfi -i sine=frequency=400 -vcodec libx264 -acodec aac -pix_fmt yuv420p -t 400 input.mp4
使用 FFmpeg 5.1.2 执行原始命令:
ffmpeg -y -i input.mp4 -filter_complex "[0:v]trim=start=175.2:end=200.9,setpts=PTS-STARTPTS[v1];[0:a]atrim=start=175.2:end=200.9,asetpts=PTS-STARTPTS[a1];[0:v]trim=start=214.3:end=324,setpts=PTS-STARTPTS[v2];[0:a]atrim=start=214.3:end=324,asetpts=PTS-STARTPTS[a2];[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
FFmpeg 5.1.2 没有警告消息。
output.mp4
检查使用MediaInfo的帧率:使用 FFmpeg 7.0 执行原始命令:
./ffmpeg-7.0-full_build/bin/ffmpeg -y -i input.mp4 -filter_complex "[0:v]trim=start=175.2:end=200.9,setpts=PTS-STARTPTS[v1];[0:a]atrim=start=175.2:end=200.9,asetpts=PTS-STARTPTS[a1];[0:v]trim=start=214.3:end=324,setpts=PTS-STARTPTS[v2];[0:a]atrim=start=214.3:end=324,asetpts=PTS-STARTPTS[a2];[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
有一条警告消息“没有有关输入帧速率的信息可用”。
使用 MediaInfo检查帧率
output.mp4
:FFmpeg 7.0 将帧速率更改为 25 fps。
使用 FFmpeg 7.0执行更新的(with
-fps_mode passthrough
)命令:./ffmpeg-7.0-full_build/bin/ffmpeg -y -i input.mp4 -fps_mode passthrough -filter_complex "[0:v]trim=start=175.2:end=200.9,setpts=PTS-STARTPTS[v1];[0:a]atrim=start=175.2:end=200.9,asetpts=PTS-STARTPTS[a1];[0:v]trim=start=214.3:end=324,setpts=PTS-STARTPTS[v2];[0:a]atrim=start=214.3:end=324,asetpts=PTS-STARTPTS[a2];[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
有一条新的警告消息:“MB 速率 (84000000) > 级别限制 (16711680)”(另一个错误?)。
使用 MediaInfo检查帧率
output.mp4
:大多数视频播放器都会忽略“级别”,但如果级别 6.2 有问题,请尝试使用其他版本的 FFmpeg。