$ ffmpeg -i source-file.foo -ss 0 -t 600 first-10-min.m4v $ ffmpeg -i source-file.foo -ss 600 -t 600 second-10-min.m4v $ ffmpeg -i source-file.foo -ss 1200 -t 600 third-10-min.m4v ...
Wrapping this up into a script to do it in a loop wouldn’t be hard.
Beware that if you try to calculate the number of iterations based on the duration output from an
ffprobe call that this is estimated from the average bit rate at the start of the clip and the clip’s file size unless you give the
-count_frames argument, which slows its operation considerably.
Another thing to be aware of is that the position of the
-ss option on the command line matters. Where I have it now is slow but accurate. The first version of this answer gave the fast but inaccurate alternative. The linked article also describes a mostly-fast-but-still-accurate alternative, which you pay for with a bit of complexity.
All that aside, I don’t think you really want to be cutting at exactly 10 minutes for each clip. That will put cuts right in the middle of sentences, even words. I think you should be using a video editor or player to find natural cut points just shy of 10 minutes apart.
Assuming your file is in a format that YouTube can accept directly, you don’t have to reencode to get segments. Just pass the natural cut point offsets to
ffmpeg, telling it to pass the encoded A/V through untouched by using the “copy” codec:
$ ffmpeg -i source.m4v -ss 0 -t 593.3 -c copy part1.m4v $ ffmpeg -i source.m4v -ss 593.3 -t 551.64 -c copy part2.m4v $ ffmpeg -i source.m4v -ss 1144.94 -t 581.25 -c copy part3.m4v ...
-c copy argument tells it to copy all input streams (audio, video, and potentially others, such as subtitles) into the output as-is. For simple A/V programs, it is equivalent to the more verbose flags
-c:v copy -c:a copy or the old-style flags
-vcodec copy -acodec copy. You would use the more verbose style when you want to copy only one of the streams, but re-encode the other. For example, many years ago there was a common practice with QuickTime files to compress the video with H.264 video but leave the audio as uncompressed PCM; if you ran across such a file today, you could modernize it with
-c:v copy -c:a aac to reprocess just the audio stream, leaving the video untouched.
The start point for every command above after the first is the previous command’s start point plus the previous command’s duration.
Here is the one line solution:
ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment output%03d.mp4
Please note that this does not give you accurate splits, but should fit your needs. It will instead cut at the first frame after the time specified after
segment_time, in the code above it would be after the 20 minute mark.
If you find that only the first chunk is playable, try adding
-reset_timestamps 1 as mentioned in the comments.
ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment -reset_timestamps 1 output%03d.mp4
An Alternate more readable way would be
ffmpeg -i input.mp4 -ss 00:00:00 -to 00:10:00 -c copy output1.mp4 ffmpeg -i input.mp4 -ss 00:10:00 -to 00:20:00 -c copy output2.mp4 /** * -i input file * -ss start time in seconds or in hh:mm:ss * -to end time in seconds or in hh:mm:ss * -c codec to use */
Here’s the source and list of Commonly used FFmpeg commands.