UPDATE: The source code for this simple script has been moved to GitHub, get it here: https://github.com/c0decracker/video-splitter
Recently I needed to upload a whole bunch of long video files. Maximum allowed length for each video was just few minutes, while the actual length of files I tried to upload were about an hour each. FFmpeg is really great for splitting the video files and Python is quite handy for automating the task. Combining two together in this handy little script(see below). The script below takes a video file and a chunk size in seconds and splits the video file into chunks using ffmpeg, so each chunk is self contained, playable video.
Source code:
#!/usr/bin/env python import subprocess import re import math from optparse import OptionParser length_regexp = 'Duration: (\d{2}):(\d{2}):(\d{2})\.\d+,' re_length = re.compile(length_regexp) def main(): (filename, split_length) = parse_options() if split_length <= 0: print "Split length can't be 0" raise SystemExit output = subprocess.Popen("ffmpeg -i '"+filename+"' 2>&1 | grep 'Duration'", shell = True, stdout = subprocess.PIPE ).stdout.read() print output matches = re_length.search(output) if matches: video_length = int(matches.group(1)) * 3600 + \ int(matches.group(2)) * 60 + \ int(matches.group(3)) print "Video length in seconds: "+str(video_length) else: print "Can't determine video length." raise SystemExit split_count = math.ceil(video_length/float(split_length)) if(split_count == 1): print "Video length is less then the target split length." raise SystemExit split_cmd = "ffmpeg -i '"+filename+"' -vcodec copy " for n in range(0, split_count): split_str = "" if n == 0: split_start = 0 else: split_start = split_length * n split_str += " -ss "+str(split_start)+" -t "+str(split_length) + \ " '"+filename[:-4] + "-" + str(n) + "." + filename[-3:] + \ "'" print "About to run: "+split_cmd+split_str output = subprocess.Popen(split_cmd+split_str, shell = True, stdout = subprocess.PIPE).stdout.read() def parse_options(): parser = OptionParser() parser.add_option("-f", "--file", dest = "filename", help = "file to split, for example sample.avi", type = "string", action = "store" ) parser.add_option("-s", "--split-size", dest = "split_size", help = "split or chunk size in seconds, for example 10", type = "int", action = "store" ) (options, args) = parser.parse_args() if options.filename and options.split_size: return (options.filename, options.split_size) else: parser.print_help() raise SystemExit if __name__ == '__main__': try: main() except Exception, e: print "Exception occured running main():" print str(e)
Or download it here: splitting video file script link