diff --git a/ffmpeg/_filters.py b/ffmpeg/_filters.py index d220b69..9cffc17 100644 --- a/ffmpeg/_filters.py +++ b/ffmpeg/_filters.py @@ -52,6 +52,11 @@ def split(stream): return FilterNode(stream, split.__name__) +@filter_operator() +def asplit(stream): + return FilterNode(stream, asplit.__name__) + + @filter_operator() def setpts(stream, expr): """Change the PTS (presentation timestamp) of the input frames. diff --git a/ffmpeg/nodes.py b/ffmpeg/nodes.py index 2b4c94f..013025d 100644 --- a/ffmpeg/nodes.py +++ b/ffmpeg/nodes.py @@ -152,7 +152,7 @@ class FilterNode(Node): def _get_filter(self, outgoing_edges): args = self.args kwargs = self.kwargs - if self.name == 'split': + if self.name in ('split', 'asplit'): args = [len(outgoing_edges)] out_args = [escape_chars(x, '\\\'=:') for x in args] diff --git a/ffmpeg/tests/test_ffmpeg.py b/ffmpeg/tests/test_ffmpeg.py index 1380fdb..318f03d 100644 --- a/ffmpeg/tests/test_ffmpeg.py +++ b/ffmpeg/tests/test_ffmpeg.py @@ -147,6 +147,41 @@ def test_get_args_complex_filter(): ] +def _get_complex_filter_asplit_example(): + split = (ffmpeg + .input(TEST_INPUT_FILE1) + .vflip() + .asplit() + ) + split0 = split[0] + split1 = split[1] + + return (ffmpeg + .concat( + split0.filter_("atrim", start=10, end=20), + split1.filter_("atrim", start=30, end=40), + ) + .output(TEST_OUTPUT_FILE1) + .overwrite_output() + ) + + +def test_filter_asplit(): + out = _get_complex_filter_asplit_example() + args = out.get_args() + assert args == [ + '-i', + TEST_INPUT_FILE1, + '-filter_complex', + '[0]vflip[s0];[s0]asplit=2[s1][s2];[s1]atrim=end=20:start=10[s3];[s2]atrim=end=40:start=30[s4];[s3]' + '[s4]concat=n=2[s5]', + '-map', + '[s5]', + TEST_OUTPUT_FILE1, + '-y' + ] + + def test_filter_normal_arg_escape(): """Test string escaping of normal filter args (e.g. ``font`` param of ``drawtext`` filter).""" def _get_drawtext_font_repr(font):