I know it's been asked before but I couldn't find a fast and accurate solution yet, I want to trim videos with a maximum lenght of 15 seconds. Here is what I've tried so far, I'm working with this video as example:http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_30mb.mp4
The fastest way
This is by far the fastest way because it doesn't need to re-encode the video but it's very innacurate in this video because the key frames are every 5-10 seconds:
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -ss 30 -to 50 -c copy -y out.mp4
Here is how I check the key frames in this video:
ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv SampleVideo_1280x720_30mb.mp4 | grep -n I | cut -d ':' -f 1
With this command I found out that the second key frame it's in the 211th frame which means 210 frames between the first key frame and the second, knowing that it's a 25fps video it would be around 8 seconds between the key frames, so any cut between 1-8 seconds would fall in one of this frames which is a huge difference for a 15 seconds video.
The accurate way
This way it's accurate but it requires to re-encode the video:
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -ss 30 -to 50 -preset ultrafast -y out.mp4
The problem is this command takes more than 20 seconds to finish using the ultrafast preset, in a samsung galaxy s6 edge plus which probably would be much more in other devices.
Nevertheless, if I open the SampleVideo_1280x720_30mb.mp4 in Instagram and trim it they get an accurate trim in less than 2 seconds.
I also tried to force the keyframes every second, but it also requires to re-encode the video and it affects the video quality:
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -force_key_frames "expr:gte(t,n_forced*1)" out.mp4
Does anybody know how Instagram trim the videos or a way to get a fast and accurate trim with FFMpeg?