I try to figure out how to use FFmpeg to trim videos. I have created a 30 second .mov
screen capture using Apple's QuickTime player, and then tried to trim it using three different ways:
Using
-copyts
, without re-encodingffmpeg -copyts -ss 00:00:10 -i input.mov -to 00:00:15 -map 0 -c copy output.mov
Using
-copyts
, with re-encodingffmpeg -copyts -ss 00:00:10 -i input.mov -to 00:00:15 -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mov
Using
-trim
(with re-encoding, which is the only option):ffmpeg -i input.mov -vf trim=10:15 output.mov
No matter which approach I tried, the output video is always 15 seconds long and the first 10 seconds of that is just a black screen, whereas what I expected is a 5-second video and without the black screen.
All the three solutions are from here: Cut part from video file from start position to end position with FFmpeg (answers by @slhck and @malat), and are very high-voted, so I expect they should work without issues, but they don't. Why is that? Is there a problem with the commands, or with the video?
The video is uploaded here: https://github.com/jsx97/test/blob/main/input.mov
trim=10:15,setpts=PTS-STARTPTS
for third script.setpts=PTS-STARTPTS
is a recommended practice, which is often overlooked?-c copy
), without-copyts
(so that the timestamp of the first output frames starts from zero), and with-t 5
instead of-to 15
:ffmpeg -y -ss 00:00:10 -i input.mov -t 5 -c copy output.mov
. In case it's not working, try the other solutions. The reason for the black screen is that the timestamp of the first frame is 10.0 (seconds) due to-copyts
, and not zero. We may check the PTS timestamps using FFprobe:ffprobe -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries frame=pts_time output.mov
.