That’d fall into category A.
If there is a skip once per 24 frames, then the source clip was 25 fps. So the corrective measure is to interpolate that missing frame.
If the skip is always at the same location in each 24 frame cycle, then you can perfectly solve the problem by interpolating a new frame between the skip frame and the preceding frame in each 24 frame cycle [*]. If the skip location varies in the 24-frame cycle, Try the filter I linked as it’s designed for that exact use case.
The problem with the linked filter is that it operates on motion differences within each cycle, so as long as the motion is sort of uniform within a cycle, it will accurately detect and fix the skip. But if the cycle contains other sharp motion (e.g. someone flicking a sword across the screen, for 1-2 frames only) then it may incorrectly interpolate the frame in that other motion if the frame difference for that other motion is larger than the skip itself. Overall though, I find that it does a good job most of the time, so tend to just use it, then scrub the video to see of the overall motion is pleasing in the fixed clip. If it is, I go with it since the “average person” is even less discerning than I am :slight_smile 
[*] Here’s an example avisynth script for fixing the first variant (fixed position of the skip in each cycle)
# Produces a clip where even frames are original and odd are new interpolated ones "in between" the original frames.
function Interpolate2xFramerate(last) {
super = MSuper(pel=2, hpad=0, vpad=0, rfilter=4)
bv1 = MAnalyse(super, overlap=8, chroma=true, isb=true, blksize=32, searchparam=3, plevel=0, search=3, badrange=(-24))
fv1 = MAnalyse(super, overlap=8, chroma=true, isb=false, blksize=32, searchparam=3, plevel=0, search=3, badrange=(-24))
bv2 = MRecalculate(super, overlap=4, chroma=true, bv1, blksize=16, searchparam=3, search=3)
fv2 = MRecalculate(super, overlap=4, chroma=true, fv1, blksize=16, searchparam=3, search=3)
bv3 = MRecalculate(super, overlap=4, chroma=true, bv2, blksize=8, searchparam=1, search=3)
fv3 = MRecalculate(super, overlap=4, chroma=true, fv2, blksize=8, searchparam=1, search=3)
bv4 = MRecalculate(super, chroma=true, bv3, blksize=4, searchparam=0, search=3)
fv4 = MRecalculate(super, chroma=true, fv3, blksize=4, searchparam=0, search=3)
MBlockFps(super, bv4, fv4, num=2*FrameRateNumerator(), den=FrameRateDenominator(), mode=0, blend=false)
}
# The source clip is 24 fps with one skip 8 frames into the clip that repeats cyclically every 24 frames.
# Note that indexing is zero based, so the frame index in each cycle is one less; 7 (first frame has index 0 not 1)
FFVideoSource("sample.mp4")
Interpolate2xFramerate() # remember: the produced clip has 2x original framerate
# Select 25 frames; 24 of which are original and 1 interpolated.
# Pick the interpolated frame **after** the observed skippy frame, to transform the skip into smooth motion.
#
# <2x original fps> <first set of original frames> <remaining set of original frames in the cycle>
# | | <the interpolated frame> |
# | | | |
SelectEvery(24*2, 0,2,4,6,8,10,12, 13 ,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46)
The logic for how this works:
A cycle in the source clip has motion (o = frame with smooth motion, S = skip noticed):
o o o o o o o S o o o o o o o o o o o o o o o o
This is because there’s a frame missing at index position S-1
, so we want the final clip cycles to look as follows:
o o o o o o o i S o o o o o o o o o o o o o o o o
note: i
denotes a new interpolated frame between two frames (S-1 and S in this case)
We accomplish this by interpolating the entire clip to produce:
o i o i o i o i o i o i o i S i o i o i o i o i o i o i o i o i o i o i o i o i o i o i o i o i
Then we simply drop all odd (interpolated) frames, except for the interpolated frame just before the skip, and that smoothes out the skip and leaves us with a new clip that has one extra frame per cycle. As our original clip had 24 fps, that gives us the desired target frame rate of original_fps * (cycle_length + 1) / cycle_length = new_fps
(from 24 → 25 fps in this case).
You can then just mux the audio onto the produced video stream and video and audio will stay in sync.