Mercurial > hg > config
annotate python/ffslice.py @ 916:82763d37ab09
add web2 convenience script
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Thu, 30 May 2024 18:56:59 -0700 |
parents | f011ec45b8e8 |
children |
rev | line source |
---|---|
741
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
3 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
4 """ |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
5 slice a clip with `ffmpeg`: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
6 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
7 ffmpeg -ss <00:00:00> -t <sec> -i <input_file> -q 1 <output_file> # |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
8 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
9 --ss = start time ; |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
10 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
11 -t = length of video to create from the start time in seconds. |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
12 """ |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
13 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
14 # imports |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
15 import argparse |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
16 import os |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
17 import subprocess |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
18 import sys |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
19 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
20 # module globals |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
21 __all__ = ['main', 'Parser'] |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
22 here = os.path.dirname(os.path.realpath(__file__)) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
23 string = (str, unicode) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
24 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
25 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
26 def ensure_dir(directory): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
27 """ensure a directory exists""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
28 if os.path.exists(directory): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
29 assert os.path.isdir(directory) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
30 return directory |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
31 os.makedirs(directory) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
32 return directory |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
33 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
34 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
35 def convert_seconds_to_hhmmss(time_sec): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
36 """converts `time_sec` to (hh,mm,ss)""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
37 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
38 hh = int(time_sec / 3600) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
39 mm = int((time_sec % 3600) / 60) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
40 ss = int((time_sec % 3600) % 60) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
41 return (hh,mm,ss) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
42 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
43 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
44 def format_seconds_to_hhmmss(time_sec, separator=':'): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
45 """converts `time_sec` to string 'hh:mm:ss'""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
46 return separator.join(['{:0>2d}'.format(i) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
47 for i in convert_seconds_to_hhmmss(time_sec)]) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
48 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
49 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
50 def duration(clip, ffprobe='ffprobe'): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
51 """get the duration in seconds using `ffprobe` from ffmpeg""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
52 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
53 command = [ffprobe, clip] |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
54 assert os.path.exists(clip), "Missing clip, duration not available" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
55 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
56 # probe the file |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
57 try: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
58 output = subprocess.check_output(command, stderr=subprocess.STDOUT) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
59 # (for some reason, ffprobe sends output to stderr) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
60 except subprocess.CalledProcessError as e: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
61 print (e.output) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
62 raise |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
63 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
64 duration = None |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
65 for line in output.splitlines(): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
66 # Parse the output of `ffprobe` |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
67 # look for a line like: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
68 # Duration: 00:00:59.73, start: 0.000000, bitrate: 7783 kb/s |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
69 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
70 line = line.strip() |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
71 if line.startswith("Duration:"): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
72 if duration: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
73 raise AssertionError("Duplicate duration - already found: {}".format(duration)) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
74 line = line.split(',')[0] |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
75 duration = line.split(':', 1)[1].strip() |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
76 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
77 if duration: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
78 hh, mm, ss = [float(i) for i in duration.split(':')] |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
79 duration = 3600*hh + 60*mm + ss |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
80 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
81 return duration |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
82 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
83 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
84 class FFSliceParser(argparse.ArgumentParser): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
85 """fflice CLI option parser""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
86 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
87 default_slice_time = 300. |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
88 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
89 def __init__(self): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
90 argparse.ArgumentParser.__init__(self, description=__doc__) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
91 self.add_argument('clips', metavar='clip', nargs='+', help="clips to slice") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
92 self.add_argument('-d', '--directory', dest='directory', |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
93 default=os.getcwd(), |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
94 help="output directory [DEFAULT: %(default)s]") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
95 self.add_argument('--durations', '--print-durations', dest='print_durations', |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
96 action='store_true', default=False, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
97 help="print durations and exit") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
98 self.add_argument('-n', dest='number', type=int, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
99 help="number of slices") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
100 self.add_argument('-t', '--time', dest='slice_time', |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
101 type=float, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
102 help="time of each slice [DEFAULT: {}]".format(self.default_slice_time)) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
103 self.add_argument('--dry-run', dest='dry_run', |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
104 action='store_true', default=False, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
105 help="print out what will be done") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
106 self.add_argument('--hhmmss', dest='hhmmss', |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
107 action='store_true', default=False, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
108 help="display times in 'hh:mm:ss' format; thedefault is in seconds") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
109 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
110 self.add_argument('-v', '--verbose', dest='verbose', |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
111 action='store_true', default=False, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
112 help="be verbose") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
113 self.options = None |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
114 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
115 def parse_args(self, *args, **kw): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
116 options = argparse.ArgumentParser.parse_args(self, *args, **kw) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
117 self.validate(options) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
118 self.options = options |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
119 return options |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
120 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
121 def validate(self, options): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
122 """validate options""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
123 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
124 missing = [clip for clip in options.clips |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
125 if not os.path.exists(clip)] |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
126 if missing: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
127 self.error("Not found: {}".format(', '.join(missing))) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
128 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
129 if options.slice_time and options.number: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
130 self.error("Cannot specify slice time and number of slices") |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
131 # TODO: allow specification of both |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
132 elif options.slice_time is None and options.number is None: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
133 options.slice_time = self.default_slice_time |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
134 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
135 ensure_dir(options.directory) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
136 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
137 def format_seconds(self, seconds): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
138 """format seconds to string""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
139 if self.options.hhmmss: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
140 return format_seconds_to_hhmmss(seconds) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
141 return '{:.2}'.format(seconds) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
142 |
754
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
143 def slice(self): |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
144 """ |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
145 iterates over all the specified clips and slices them as per input params. |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
146 The sliced clips are stored under the provided coommand line destinati |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
147 on directory or current working dir |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
148 """ |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
149 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
150 for clip_path in self.options.clip_paths: |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
151 print "***** Processing {0}".format(clip_path) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
152 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
153 if not os.path.exists(clip_path): |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
154 print "File not found! skipping {0}".format(clip_path) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
155 continue |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
156 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
157 #making sure the slice time is within bounds of the clip duration |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
158 duration = self.duration(clip_path) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
159 print "Duration: {0}".format(duration) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
160 if self.options.slice_length_sec > duration: |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
161 print "Skipping {0}, slice_time {1} is GREATER than file duration {2} ".format(clip_path,self.options.slice_length_sec ,duration) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
162 continue |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
163 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
164 #calculating the number slices to create |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
165 num_slices = 0 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
166 if self.options.num_slices: |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
167 num_slices = min (self.options.num_slices, int(duration/(self.options.slice_length_sec))) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
168 else: #number of slice were not specified |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
169 num_slices = int(duration/(self.options.slice_length_sec)) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
170 print "Slicing in {0} parts, {1} seconds each".format(num_slices,self.options.slice_length_sec) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
171 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
172 hh = 0 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
173 mm = 0 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
174 ss = 0 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
175 start_time_secs = 0 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
176 [out_filename,out_file_ext] = clip_path.split("/")[-1].split(".") #assuming the file path to be something like /df/dsf/dsf/dsf.mp4 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
177 ensure_dir(self.options.out_directory) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
178 #creating slices |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
179 for i in range(num_slices): |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
180 [hh,mm,ss] = self.format_seconds_to_hhmmss(start_time_secs) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
181 out_file_path = "{0}/{1}_{2}.{3}".format(self.options.out_directory,out_filename,i,out_file_ext) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
182 command = "ffmpeg -ss {0}:{1}:{2} -t {3} -i {4} -q {5} -strict -2 {6}".format(hh,mm,ss,self.options.slice_length_sec, |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
183 clip_path,1, out_file_path) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
184 |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
185 try: |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
186 output = subprocess.call(command, shell=True) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
187 except subprocess.CalledProcessError as e: |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
188 print (e.output) |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
189 raise |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
190 start_time_secs += self.options.slice_length_sec |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
191 |
741
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
192 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
193 def main(args=sys.argv[1:]): |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
194 """CLI""" |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
195 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
196 # parse command line options |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
197 parser = FFSliceParser() |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
198 options = parser.parse_args(args) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
199 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
200 # compute durations |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
201 durations = {clip: duration(clip) for clip in options.clips} |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
202 if options.print_durations: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
203 returncode = 0 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
204 total = 0. |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
205 for clip in options.clips: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
206 _duration = durations[clip] |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
207 if _duration is None: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
208 print ("Duration not found: '{}'".format(clip)) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
209 returncode = 1 |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
210 else: |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
211 print ('{} : {}'.format(clip, |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
212 parser.format_seconds(_duration))) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
213 sys.exit(returncode) |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
214 |
754
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
215 parser.slice() |
f011ec45b8e8
add example load type interface
Jeff Hammel <k0scist@gmail.com>
parents:
741
diff
changeset
|
216 |
741
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
217 if __name__ == '__main__': |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
218 main() |
9681a0bd74d6
add utility for slicing video files
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
219 |