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.

make_highlight_video.py 3.7 KiB

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