微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免 ffmpeg filter_complex 覆盖文件的 fps?

如何解决如何避免 ffmpeg filter_complex 覆盖文件的 fps?

我对 ffmpeg 还很陌生,所以如果这是一个简单的问题,我深表歉意。

我正在尝试使用以下脚本平铺四个 60fps 视频。它有效,但输出为 25fps。当我尝试使用 -r 将其强制回 60 时,它看起来像 25fps 上采样到 60,渲染时计算重复帧。

如何保留原始文件

ffmpeg -i vln1.mp4 -i vln2.mp4 -i vla.mp4 -i cello.mp4 -filter_complex "nullsrc=size=2800x2400 [base]; [0:v] setpts=PTS-STARTPTS,scale=2800x600 [A]; [1:v] setpts=PTS-STARTPTS,scale=2800x600 [B]; [2:v] setpts=PTS-STARTPTS,scale=2800x600 [C]; [3:v] setpts=PTS-STARTPTS,scale=2800x600 [D]; [base] [A] overlay=shortest=0 [tmp1]; [tmp1][B] overlay=shortest=0:y=600 [tmp2]; [tmp2][C] overlay=shortest=0:y=1200 [tmp3]; [tmp3][D] overlay=shortest=0:y=1800" -c:v libx264 quartetscore.mp4

解决方法

设置 nullsrc 过滤器的帧速率(默认为 25 fps):

ffmpeg -i vln1.mp4 -i vln2.mp4 -i vla.mp4 -i cello.mp4 -filter_complex "nullsrc=size=2800x2400:rate=60 [base]; [0:v] setpts=PTS-STARTPTS,scale=2800x600 [A]; [1:v] setpts=PTS-STARTPTS,scale=2800x600 [B]; [2:v] setpts=PTS-STARTPTS,scale=2800x600 [C]; [3:v] setpts=PTS-STARTPTS,scale=2800x600 [D]; [base] [A] overlay=shortest=0 [tmp1]; [tmp1][B] overlay=shortest=0:y=600 [tmp2]; [tmp2][C] overlay=shortest=0:y=1200 [tmp3]; [tmp3][D] overlay=shortest=0:y=1800" -c:v libx264 quartetscore.mp4

或者,如果您想堆叠,只需使用 hstack 过滤器而不是 nullsrc 和多个叠加:

ffmpeg -i vln1.mp4 -i vln2.mp4 -i vla.mp4 -i cello.mp4 -filter_complex "[0:v] setpts=PTS-STARTPTS,scale=2800x600 [D];[A][B][C][D]hstack=inputs=4" -c:v libx264 quartetscore.mp4

有关更多示例,请参阅 Vertically or horizontally stack (mosaic) several videos using ffmpeg?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。