addrate.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import argparse as ap
  2. from skvideo.io import FFmpegReader, FFmpegWriter
  3. from pathlib import Path
  4. import tqdm
  5. from warnings import warn
  6. DEFAULT_FPS = 25
  7. parser = ap.ArgumentParser(description="add rate information")
  8. parser.add_argument("inputfiles", nargs="+",
  9. help="the files to convert")
  10. parser.add_argument("-r", "--rate", type=int, default=DEFAULT_FPS,
  11. help="the output frame rate")
  12. parser.add_argument("-d", "--destination", default=None,
  13. help="the output directory")
  14. class SkipConversionWarning(UserWarning):
  15. pass
  16. def convert(inputfile, rate=None, destination=None):
  17. if rate is None:
  18. rate = DEFAULT_FPS
  19. if destination is None:
  20. destination = Path()
  21. inputfile = Path(inputfile)
  22. if inputfile.suffix != '.avi':
  23. warn(f"does not seem like a video file: {inputfile.name}", SkipConversionWarning, stacklevel=2)
  24. return
  25. outputfile = destination / inputfile.name
  26. if outputfile.exists():
  27. warn(f"already converted: {outputfile.name}", SkipConversionWarning, stacklevel=2)
  28. return
  29. with FFmpegReader(str(inputfile)) as src:
  30. with FFmpegWriter(str(outputfile), outputdict={"-framerate": str(rate), "-c:v": "libx264"}) as dst:
  31. for frame in tqdm.tqdm(src.nextFrame(), desc=outputfile.name, unit="frame"):
  32. dst.writeFrame(frame)
  33. def main(inputfiles=[], rate=None, destination=None):
  34. for inputfile in inputfiles:
  35. convert(inputfile, rate=rate, destination=destination)
  36. if __name__ == "__main__":
  37. kwargs = vars(parser.parse_args())
  38. main(**kwargs)