|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #!/bin/python3
- """ basicclips.py -- generate video of clips from another video
- uses ffprobe, ffmpeg and MELT
-
- """
-
- DEFAULT_CLIPS = 9
- DEFAULT_DURATION = 15
- DEFAULT_MIXER_DURATION = 2
- FRAMERATE = 60
-
-
- def get_video_duration(videofile=None):
- """Get video duration in seconds using ffprobe"""
- import subprocess
-
- if videofile is not None:
- ffprobe_args = ["ffprobe", "-v", "error", "-show_entries",
- "format=duration", "-of",
- "default=noprint_wrappers=1:nokey=1",
- videofile]
- seconds = subprocess.run(ffprobe_args, capture_output=True)
- if seconds:
- try:
- seconds = int(float(seconds.stdout))
- return seconds
- except ValueError as e:
- print("Error getting seconds for ", videofile)
- print(e)
-
-
- if __name__ == "__main__":
- import sys
- import os
- import tempfile
- import subprocess
-
- # Check/set settings using env vars
-
- if os.environ.get("HIGHLIGHT_CLIPS"):
- clips = os.environ.get("HIGHLIGHT_CLIPS")
- else:
- clips = DEFAULT_CLIPS
-
- if os.environ.get("HIGHLIGHT_DURATION"):
- duration = os.environ.get("HIGHLIGHT_DURATION")
- else:
- duration = DEFAULT_DURATION
-
- # TODO: argv sanity checks
-
- videofile = sys.argv[1]
- outputfile = sys.argv[2]
-
- video_duration = get_video_duration(videofile)
- mixer_duration = FRAMERATE * DEFAULT_MIXER_DURATION
-
- ffmpeg_common_args = ["ffmpeg", "-hide_banner",
- "-loglevel", "quiet"]
- melt_args = []
-
- with tempfile.TemporaryDirectory() as tmpdir:
- tempclip_length = duration - 3
-
- for i in range(1, clips+1):
- print("Processing clip", i)
- seek = int(float(video_duration * i / float(clips+1)))
-
- if i == 1:
- # no intro mixer on first clip
- melt_args.extend(["melt",
- os.path.join(tmpdir, "hi{}.mkv".format(i))])
- else:
- melt_args.extend([os.path.join(tmpdir, "hi{}.mkv".format(i)),
- "-mix", str(mixer_duration),
- "-mixer", "luma"])
- ffmpeg_args = ffmpeg_common_args + [
- "-ss", str(seek),
- "-i", videofile, "-t", str(tempclip_length),
- "-c", "copy", os.path.join(tmpdir, "hi{}.mkv".format(i))
- ]
- print(ffmpeg_args)
- subprocess.run(ffmpeg_args)
-
- # MELT output format
- melt_args.extend(["-consumer", "avformat:{}".format(outputfile),
- "crf=20"])
- print(melt_args)
- subprocess.run(melt_args)
-
- print("Done!")
|