1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- 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)
|