Sampling rate is not the video's frame rate
A 30 fps video does not have to give you 30 images per second. The extractor seeks to evenly spaced timestamps at whatever rate you ask for, so 2 fps gives you a contact sheet and 30 fps gives you approximately every frame.
Because it works by seeking rather than decoding the stream linearly, timestamps land on the nearest available frame. For most codecs that is exact; for heavily compressed footage with sparse keyframes, two adjacent samples can occasionally resolve to the same source frame.