The PHP-FFMpeg library appends the -ss argument by default before the input file which requires the timestamp to be accurate in order to obtain the frame. I encountered this problem in case of mkv file. Files such as mkv and mov can not be accurately seeked.
https://github.com/PHP-FFMpeg/PHP-FFMpeg/blob/master/src/FFMpeg/Media/Frame.php#L79
You need to pass true
as the second argument to the save function in order to give a Frame closest to the given point. It changes the position of -ss argument in ffmpeg command.
-ss position (input/output)
When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is
not possible to seek exactly, so ffmpeg will seek to the closest seek
point before position. When transcoding and -accurate_seek is enabled
(the default), this extra segment between the seek point and position
will be decoded and discarded. When doing stream copy or when
-noaccurate_seek is used, it will be preserved.
When used as an output option (before an output filename), decodes but
discards input until the timestamps reach position.
position must be a time duration specification, see (ffmpeg-utils)the
Time duration section in the ffmpeg-utils(1) manual.