A Python script that wraps moviepy (that in turn wraps ffmpeg
) to allow mixing and merging segments from other videos in a final video.
Tested with mp4 (h.264/mp3) videos all with the same resolution.
Use it with vcat -i inputfile1,inputfile2[start-end],… -o <outputfile>
#!/usr/bin/python3 import sys, getopt, re def printerror(errormsg): print("*** vcat - concatenate video segments using moviepy ***\n") print("ERROR:", errormsg,"\n") print("Usage: vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>") print("Optional start and end points should be given in seconds. If files have spaces, they should be quoted (e.g. \"input file.mp4[5-30]\").") try: from moviepy.editor import VideoFileClip, concatenate_videoclips except ImportError: printerror("You don't seem to have moviepy installed. Install it with `pip install moviepy`.") exit(1) def main(argv): inputfiles_arg = '' outputfile = '' try: opts, args = getopt.getopt(argv,"hi:o:",["input=","output="]) except getopt.GetoptError as err: printerror(str(err)) sys.exit(2) for opt, arg in opts: if opt == '-h': printerror("") sys.exit() elif opt in ("-i", "--input"): inputfiles_arg = arg elif opt in ("-o", "--output"): outputfile = arg if outputfile =='': printerror("Output file not specified") iFiles = inputfiles_arg.split(',') clips=[] for iFile in iFiles: subclip = re.search(r"\[([0-9\-\.]+)\]", iFile) if subclip is None: clips.append(VideoFileClip(iFile)) else: dims = subclip.group(1).split('-') if len(dims) != 2: printerror("If a specific segment of a file is specified, this should be given as [startseconds-endseconds]") iFile = iFile.replace("["+subclip.group(1)+"]",'') clips.append(VideoFileClip(iFile).subclip(float(dims[0]),float(dims[1]))) f = concatenate_videoclips(clips) f.write_videofile(outputfile) if __name__ == "__main__": main(sys.argv[1:])