You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 line
3.2 KiB

  1. """make_highlight_clips.py -- use the pipeline to make highlight clips from a video
  2. Usage:
  3. make_highlight_clips.py <input_file> [--output-dir=<dir>] [--output-filename=<filename>] [--save-json]
  4. Options:
  5. -h --help Show this screen
  6. --output-dir=<dir> Directory to save the highlight clips [default: /tmp/]
  7. --save-json Save the feature data as a JSON file [default: False]
  8. Notes:
  9. <input_file> The input file can be a video or JSON file
  10. """
  11. import os
  12. import sys
  13. import time
  14. from pipeline.feature_extractors import RandomFeatureExtractor,\
  15. LaughterFeatureExtractor, LoudAudioFeatureExtractor,\
  16. VideoActivityFeatureExtractor, JSONFeatureExtractor
  17. from pipeline.utils import SourceMedia, Source
  18. from pipeline.producers import FfmpegVideoProducer, JSONProducer
  19. from pipeline.consolidators import OverlapConsolidator
  20. from docopt import docopt
  21. def main():
  22. start_time = time.time()
  23. PRINT_SOMETHING = False
  24. if PRINT_SOMETHING:
  25. print(f"+{'-'*78}+")
  26. print(f"| Starting pipeline to make highlight clips at {time.strftime('%Y-%m-%d %H:%M:%S')}{' '*13}|")
  27. print(f"+{'-'*78}+")
  28. time.sleep(1)
  29. args = docopt(__doc__)
  30. input_file = args['<input_file>']
  31. output_dir = args['--output-dir']
  32. # expand "./" to current directory
  33. if output_dir == "./":
  34. output_dir = os.getcwd()
  35. save_json = args['--save-json']
  36. source_media = SourceMedia(sources=[Source(input_file, input_file, "manual")])
  37. combined_features = []
  38. # feature extractors: laughter, loudness, video activity, words
  39. if input_file.endswith(".json"):
  40. feature_extractors = [JSONFeatureExtractor]
  41. else:
  42. feature_extractors = [LaughterFeatureExtractor, LoudAudioFeatureExtractor,
  43. VideoActivityFeatureExtractor
  44. ]
  45. # NOTE: words FE crashes OOM due to noted issues on their GH
  46. # so omitted for now
  47. for fe in feature_extractors:
  48. fe_instance = fe(input_files=source_media)
  49. fe_instance.setup()
  50. fe_instance.run()
  51. fe_instance.teardown()
  52. if fe_instance.features:
  53. combined_features.extend(fe_instance.features)
  54. if combined_features:
  55. if PRINT_SOMETHING:
  56. for f in combined_features:
  57. print(f"Feature: {f}")
  58. # consolidate features
  59. oc = OverlapConsolidator(features=combined_features)
  60. oc.consolidate()
  61. # output before video
  62. if save_json:
  63. jsonprod = JSONProducer(features=combined_features)
  64. jsonprod.produce()
  65. # make video from features:
  66. ffprod = FfmpegVideoProducer(features=oc.features,
  67. output_dir=output_dir,
  68. compile_clips=False)
  69. ffprod.produce()
  70. end_time = time.time()
  71. if PRINT_SOMETHING:
  72. print(f"+{'-'*78}+")
  73. print(f"| Pipeline finished creating highlight video at {time.strftime('%Y-%m-%d %H:%M:%S')}{' '*12}|")
  74. print(f"| Total time: {end_time - start_time:.2f} seconds {' '*51}|")
  75. print(f"+{'-'*78}+")
  76. if __name__ == '__main__':
  77. main()