RazrFalcon (12019-09-23): > and it works fine. But when I'm trying to use a "variable" framerate like > this: > > ffmpeg -i raw.mp4 -filter_complex "[v:0]setpts='lerp(2,8,T/5)*PTS'" -r 30 > out.mp4 > > (5 is a video duration in seconds) > > the resulting video stutters a lot. > > Is there are a correct way to smoothly change the framerate using some > curve/function?
This is a math issue. Imagine you want to slow down the second half of a 20 seconds video. The formula for the first half is just t' = t. The formula for the second half would, naively, be t' = 2*t. But try to plot this, for example in gnuplot: plot [0:20] x < 10 ? x : 2 * x It does not match at the stitch point. Instead, the second formula needs to be t'=2*t-10: plot [0:20] x < 10 ? x : 2 * x - 10 If we neglect the fact that frames are discrete, we can say that the frame rate is the speed of the frames timestamps. In mathematical terms, the derivative. The derivative of a linear function is easy. Other kinds are more tricky. If you have a constant frame rate, the timestamps will be affine, but you can still choose the constant offset. If you want to connect two segments with constant frame rate, you need to adjust the offsets so that they match. Hence the -10 in the example. If the frame rate varies continuously, you need to do the calculus. Fortunately, with a linear interpolation, the calculus is easy. For the same reason: sin( (440 + t / 10 * 440) * t) will NOT give a sine sound going smoothly from 440 Hz to 880 Hz. Regards, -- Nicolas George
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-user mailing list ffmpeg-user@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-user To unsubscribe, visit link above, or email ffmpeg-user-requ...@ffmpeg.org with subject "unsubscribe".