https://ffmpeg.org/ffmpeg.html#Main-options
> -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 url), decodes but discards input until the timestamps reach position.
It is much slower when used an output option, and I don't really know what it does when you do stream copy, but I suspect it leaves the whole segment with some sort of offset instruction. I often get artefacts when I play it back on vlc, so I try to avoid that option (unless I am re-encoding).
I believe this has no effect on whether or not you can cut precisely - if transcoding is not enabled, even if ffmpeg is sticking the frames before the first keyframe in the output file, they're effectively garbage from the point of view of the decoder (which might explain why you see artifacts in some players).
It's possible to reencode a (h264-encoded, at least) video up to the first keyframe; it's discussed in this StackExchange submission: https://video.stackexchange.com/a/23542
Coincidentally, I refined the above approach very recently and posted the result to my own blog: https://csrd.science/blag/2020/trimming-an-h264-video-and-pr...
The gist is to extract and reencode the segment containing the group of pictures to be cut (using the stream segment muxer), then rejoin the subsequent segments and remux the trimmed audio back in afterwards.
It was an instant processing thing but I don't remember for sure if it was the same command.
Certainly if the duration specified doesn't land you on a key frame it also ends at the closest keyframe.
Would the following work?
# Calculate the exact start time (in s.msec format) via: START = start_frame_number/frames_per_second
ffmpeg -ss $START -i video.mp4 -c copy -map 0 -frames 1400 output.mp4
Screencasts don't need frame precision fortunately. A set up that isn't completely polished also feels more authentic.