start adding intro framework
This commit is contained in:
parent
b49b05c4d3
commit
1d6e0ce290
50
main.py
50
main.py
@ -38,6 +38,22 @@ def main(args):
|
|||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
log.info("preparing video", input_video=input_file)
|
log.info("preparing video", input_video=input_file)
|
||||||
|
|
||||||
|
intro_file = args.introvidpath
|
||||||
|
if intro_file is not None:
|
||||||
|
intro_vid_path = Path(intro_file)
|
||||||
|
if not in_vid_path.is_file():
|
||||||
|
log.error("the specified input path does not exist for the intro", path=intro_file)
|
||||||
|
sys.exit(-1)
|
||||||
|
log.info("found intro", input_video=intro_file)
|
||||||
|
|
||||||
|
outro_file = args.outrovidpath
|
||||||
|
if outro_file is not None:
|
||||||
|
outro_vid_path = Path(outro_file)
|
||||||
|
if not outro_vid_path.is_file():
|
||||||
|
log.error("the specified input path does not exist for the outro", path=outro_file)
|
||||||
|
sys.exit(-1)
|
||||||
|
log.info("found outro", input_video=outro_file)
|
||||||
|
|
||||||
# Hash the video, we use this to see if we have processed this video before
|
# Hash the video, we use this to see if we have processed this video before
|
||||||
# and as a simple way to generate temp file names
|
# and as a simple way to generate temp file names
|
||||||
sha1 = hashlib.sha1()
|
sha1 = hashlib.sha1()
|
||||||
@ -135,7 +151,7 @@ def main(args):
|
|||||||
out_path = Path(args.destination)
|
out_path = Path(args.destination)
|
||||||
log.info("rendering...")
|
log.info("rendering...")
|
||||||
start = time.time()
|
start = time.time()
|
||||||
render_moments(moment_results[index_min][0], str(in_vid_path.resolve()), str(out_path.resolve()))
|
render_moments(moment_results[index_min][0], str(in_vid_path.resolve()), str(out_path.resolve()), intro_path=intro_file, parallelism=args.parallelism)
|
||||||
log.info("render complete", duration=time.time() - start, output=str(out_path.resolve()))
|
log.info("render complete", duration=time.time() - start, output=str(out_path.resolve()))
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
iterations = iterations + parallelism
|
iterations = iterations + parallelism
|
||||||
@ -183,19 +199,47 @@ if __name__ == "__main__":
|
|||||||
parser.add_argument("--cost-function", dest="cost", choices=ERROR_FUNCS.keys(), default='quadratic')
|
parser.add_argument("--cost-function", dest="cost", choices=ERROR_FUNCS.keys(), default='quadratic')
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--minduration",
|
"--min-duration",
|
||||||
default=8,
|
default=8,
|
||||||
help="Minimum clip duration",
|
help="Minimum clip duration",
|
||||||
dest="mindur",
|
dest="mindur",
|
||||||
type=int,
|
type=int,
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--maxduration",
|
"--max-duration",
|
||||||
default=15,
|
default=15,
|
||||||
help="Maximum clip duration",
|
help="Maximum clip duration",
|
||||||
dest="maxdur",
|
dest="maxdur",
|
||||||
type=int,
|
type=int,
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--intro-video",
|
||||||
|
default=None,
|
||||||
|
help="Path to a video file to use as an intro",
|
||||||
|
dest="introvidpath",
|
||||||
|
type=str,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--outro-video",
|
||||||
|
default=None,
|
||||||
|
help="Path to a video file to use as an outro",
|
||||||
|
dest="outrovidpath",
|
||||||
|
type=str,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--title-slide-text",
|
||||||
|
default=None,
|
||||||
|
help="Text to show during a title slide. The title slide is played after any provided intro. If there is no intro, the title slide is the intro",
|
||||||
|
dest="outrovidpath",
|
||||||
|
type=str,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--title-slide-duration",
|
||||||
|
default=5,
|
||||||
|
help="Time, in seconds, to show a title slide for",
|
||||||
|
dest="outrovidpath",
|
||||||
|
type=str,
|
||||||
|
)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
try:
|
try:
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import moviepy.editor as mp
|
import moviepy.editor as mp
|
||||||
|
from moviepy.video.compositing.CompositeVideoClip import CompositeVideoClip
|
||||||
|
|
||||||
def get_subclips(source_video_path, moments):
|
def get_subclips(source_video_path, moments):
|
||||||
vid = mp.VideoFileClip(source_video_path)
|
vid = mp.VideoFileClip(source_video_path)
|
||||||
@ -7,10 +8,15 @@ def get_subclips(source_video_path, moments):
|
|||||||
clips.append(vid.subclip(m.start, m.stop))
|
clips.append(vid.subclip(m.start, m.stop))
|
||||||
return clips, vid
|
return clips, vid
|
||||||
|
|
||||||
def render_moments(moments, input_video_path, output_path):
|
def render_moments(moments, input_video_path, output_path, intro_path=None, outro_path=None, parallelism=1):
|
||||||
clips, vid = get_subclips(input_video_path, moments)
|
clips, vid = get_subclips(input_video_path, moments)
|
||||||
to_render = mp.concatenate_videoclips(clips)
|
size = clips[0].size
|
||||||
to_render.write_videofile(output_path, logger=None)
|
if intro_path is not None:
|
||||||
|
iclip = mp.VideoFileClip(intro_path)
|
||||||
|
clips.insert(0, iclip)
|
||||||
|
composite = CompositeVideoClip(clips, size=size)
|
||||||
|
composite.preview()
|
||||||
|
composite.write_videofile(output_path, logger=None, threads=parallelism)
|
||||||
|
|
||||||
def filter_moments(moments, min_length, max_length):
|
def filter_moments(moments, min_length, max_length):
|
||||||
return [m for m in moments if m.get_duration() > min_length and m.get_duration() < max_length]
|
return [m for m in moments if m.get_duration() > min_length and m.get_duration() < max_length]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user