当我使用此代码时:
ffmpeg -i a.mp4 -filter:v "setpts='if(between(T,3,5),PTS*3,PTS)'" -b:v 3000k -s 1440x720 d.mp4
我得到的输出在第 3 秒停止,从第 9 秒开始慢动作运行,并在第 14 秒的某个时间结束。重新缩放和更改比特率不会影响这一点。输出时没有显示警告。那么为什么它会冻结输出 6 秒呢?
答案1
您的 setpts 表达式在 t=3 之后留下了空白。
这是从输入到输出时间戳的映射:
0 --> PTS --> 0
1 --> PTS --> 1
2 --> PTS --> 2
3 --> PTS*3 --> 9
4 --> PTS*3 --> 12
5 --> PTS*3 --> 15
6 --> PTS --> 6 --> 15.001
7 --> PTS --> 7 --> 15.002
8 --> PTS --> 8 --> 15.003
...
更简单但更长的方法是使用 trim、setpts 和 concat 过滤器的组合,如下所示https://video.stackexchange.com/q/21800/