import argparse as ap from skvideo.io import FFmpegReader, FFmpegWriter from pathlib import Path import tqdm from warnings import warn DEFAULT_FPS = 25 parser = ap.ArgumentParser(description="add rate information") parser.add_argument("inputfiles", nargs="+", help="the files to convert") parser.add_argument("-r", "--rate", type=int, default=DEFAULT_FPS, help="the output frame rate") parser.add_argument("-d", "--destination", default=None, help="the output directory") class SkipConversionWarning(UserWarning): pass def convert(inputfile, rate=None, destination=None): if rate is None: rate = DEFAULT_FPS if destination is None: destination = Path() inputfile = Path(inputfile) if inputfile.suffix != '.avi': warn(f"does not seem like a video file: {inputfile.name}", SkipConversionWarning, stacklevel=2) return outputfile = destination / inputfile.name if outputfile.exists(): warn(f"already converted: {outputfile.name}", SkipConversionWarning, stacklevel=2) return with FFmpegReader(str(inputfile)) as src: with FFmpegWriter(str(outputfile), outputdict={"-framerate": str(rate), "-c:v": "libx264"}) as dst: for frame in tqdm.tqdm(src.nextFrame(), desc=outputfile.name, unit="frame"): dst.writeFrame(frame) def main(inputfiles=[], rate=None, destination=None): for inputfile in inputfiles: convert(inputfile, rate=rate, destination=destination) if __name__ == "__main__": kwargs = vars(parser.parse_args()) main(**kwargs)