8
8
import operator
9
9
import subprocess
10
10
11
- from ._ffmpeg import (
12
- input ,
13
- output ,
14
- )
11
+ from ._ffmpeg import input , output
15
12
from .nodes import (
16
13
get_stream_spec_nodes ,
17
14
FilterNode ,
24
21
25
22
class Error (Exception ):
26
23
def __init__ (self , cmd , stdout , stderr ):
27
- super (Error , self ).__init__ ('{} error (see stderr output for detail)' .format (cmd ))
24
+ super (Error , self ).__init__ (
25
+ '{} error (see stderr output for detail)' .format (cmd )
26
+ )
28
27
self .stdout = stdout
29
28
self .stderr = stderr
30
29
@@ -69,9 +68,15 @@ def _format_output_stream_name(stream_name_map, edge):
69
68
def _get_filter_spec (node , outgoing_edge_map , stream_name_map ):
70
69
incoming_edges = node .incoming_edges
71
70
outgoing_edges = get_outgoing_edges (node , outgoing_edge_map )
72
- inputs = [_format_input_stream_name (stream_name_map , edge ) for edge in incoming_edges ]
73
- outputs = [_format_output_stream_name (stream_name_map , edge ) for edge in outgoing_edges ]
74
- filter_spec = '{}{}{}' .format ('' .join (inputs ), node ._get_filter (outgoing_edges ), '' .join (outputs ))
71
+ inputs = [
72
+ _format_input_stream_name (stream_name_map , edge ) for edge in incoming_edges
73
+ ]
74
+ outputs = [
75
+ _format_output_stream_name (stream_name_map , edge ) for edge in outgoing_edges
76
+ ]
77
+ filter_spec = '{}{}{}' .format (
78
+ '' .join (inputs ), node ._get_filter (outgoing_edges ), '' .join (outputs )
79
+ )
75
80
return filter_spec
76
81
77
82
@@ -84,14 +89,20 @@ def _allocate_filter_stream_names(filter_nodes, outgoing_edge_maps, stream_name_
84
89
# TODO: automatically insert `splits` ahead of time via graph transformation.
85
90
raise ValueError (
86
91
'Encountered {} with multiple outgoing edges with same upstream label {!r}; a '
87
- '`split` filter is probably required' .format (upstream_node , upstream_label ))
92
+ '`split` filter is probably required' .format (
93
+ upstream_node , upstream_label
94
+ )
95
+ )
88
96
stream_name_map [upstream_node , upstream_label ] = 's{}' .format (stream_count )
89
97
stream_count += 1
90
98
91
99
92
100
def _get_filter_arg (filter_nodes , outgoing_edge_maps , stream_name_map ):
93
101
_allocate_filter_stream_names (filter_nodes , outgoing_edge_maps , stream_name_map )
94
- filter_specs = [_get_filter_spec (node , outgoing_edge_maps [node ], stream_name_map ) for node in filter_nodes ]
102
+ filter_specs = [
103
+ _get_filter_spec (node , outgoing_edge_maps [node ], stream_name_map )
104
+ for node in filter_nodes
105
+ ]
95
106
return ';' .join (filter_specs )
96
107
97
108
@@ -109,7 +120,9 @@ def _get_output_args(node, stream_name_map):
109
120
110
121
for edge in node .incoming_edges :
111
122
# edge = node.incoming_edges[0]
112
- stream_name = _format_input_stream_name (stream_name_map , edge , is_final_arg = True )
123
+ stream_name = _format_input_stream_name (
124
+ stream_name_map , edge , is_final_arg = True
125
+ )
113
126
if stream_name != '0' or len (node .incoming_edges ) > 1 :
114
127
args += ['-map' , stream_name ]
115
128
@@ -123,7 +136,9 @@ def _get_output_args(node, stream_name_map):
123
136
args += ['-b:a' , str (kwargs .pop ('audio_bitrate' ))]
124
137
if 'video_size' in kwargs :
125
138
video_size = kwargs .pop ('video_size' )
126
- if not isinstance (video_size , basestring ) and isinstance (video_size , collections .Iterable ):
139
+ if not isinstance (video_size , basestring ) and isinstance (
140
+ video_size , collections .Iterable
141
+ ):
127
142
video_size = '{}x{}' .format (video_size [0 ], video_size [1 ])
128
143
args += ['-video_size' , video_size ]
129
144
args += convert_kwargs_to_cmd_line_args (kwargs )
@@ -147,7 +162,9 @@ def get_args(stream_spec, overwrite_output=False):
147
162
args += reduce (operator .add , [_get_input_args (node ) for node in input_nodes ])
148
163
if filter_arg :
149
164
args += ['-filter_complex' , filter_arg ]
150
- args += reduce (operator .add , [_get_output_args (node , stream_name_map ) for node in output_nodes ])
165
+ args += reduce (
166
+ operator .add , [_get_output_args (node , stream_name_map ) for node in output_nodes ]
167
+ )
151
168
args += reduce (operator .add , [_get_global_args (node ) for node in global_nodes ], [])
152
169
if overwrite_output :
153
170
args += ['-y' ]
@@ -175,8 +192,14 @@ def compile(stream_spec, cmd='ffmpeg', overwrite_output=False):
175
192
176
193
@output_operator ()
177
194
def run_async (
178
- stream_spec , cmd = 'ffmpeg' , pipe_stdin = False , pipe_stdout = False , pipe_stderr = False ,
179
- quiet = False , overwrite_output = False ):
195
+ stream_spec ,
196
+ cmd = 'ffmpeg' ,
197
+ pipe_stdin = False ,
198
+ pipe_stdout = False ,
199
+ pipe_stderr = False ,
200
+ quiet = False ,
201
+ overwrite_output = False ,
202
+ ):
180
203
"""Asynchronously invoke ffmpeg for the supplied node graph.
181
204
182
205
Args:
@@ -259,13 +282,20 @@ def run_async(
259
282
stdout_stream = subprocess .PIPE if pipe_stdout or quiet else None
260
283
stderr_stream = subprocess .PIPE if pipe_stderr or quiet else None
261
284
return subprocess .Popen (
262
- args , stdin = stdin_stream , stdout = stdout_stream , stderr = stderr_stream )
285
+ args , stdin = stdin_stream , stdout = stdout_stream , stderr = stderr_stream
286
+ )
263
287
264
288
265
289
@output_operator ()
266
290
def run (
267
- stream_spec , cmd = 'ffmpeg' , capture_stdout = False , capture_stderr = False , input = None ,
268
- quiet = False , overwrite_output = False ):
291
+ stream_spec ,
292
+ cmd = 'ffmpeg' ,
293
+ capture_
F438
stdout = False ,
294
+ capture_stderr = False ,
295
+ input = None ,
296
+ quiet = False ,
297
+ overwrite_output = False ,
298
+ ):
269
299
"""Invoke ffmpeg for the supplied node graph.
270
300
271
301
Args:
@@ -296,10 +326,4 @@ def run(
296
326
return out , err
297
327
298
328
299
- __all__ = [
300
- 'compile' ,
301
- 'Error' ,
302
- 'get_args' ,
303
- 'run' ,
304
- 'run_async' ,
305
- ]
329
+ __all__ = ['compile' , 'Error' , 'get_args' , 'run' , 'run_async' ]
0 commit comments