From 7db10ccf98bb430507dca7d85c05a49ceb0c31fe Mon Sep 17 00:00:00 2001 From: Karl Kroening Date: Sat, 13 May 2017 19:25:09 -1000 Subject: [PATCH] Add documentation --- README.md | 32 ++++++++++++++++++++++++++++++++ doc/graph1.png | Bin 0 -> 29268 bytes ffmpeg.py | 18 ++++++++++-------- 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 README.md create mode 100644 doc/graph1.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed57c45 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# ffmpeg-python: Powerfully simple A/V routing with Python + +FFmpeg is extremely powerful, but its command-line interface gets really complicated really quickly - especially when working with signal graphs and doing anything more than trivial. + +Take for example a signal graph that looks like this: +![Signal graph](https://raw.githubusercontent.com/kkroening/ffmpeg-python/master/doc/graph1.png) + +The corresponding command-line arguments are pretty gnarly: +``` +ffmpeg -i input.mp4 -filter_complex "[0]trim=start_frame=10:end_frame=20,setpts=PTS-STARTPTS[v0];[0]trim=start_frame=30:end_frame=40,setpts=PTS-STARTPTS[v1];[0]trim=start_frame=50:end_frame=60,setpts=PTS-STARTPTS[v2];[v0][v1][v2]concat=n=3[v3]" -map [v3] output.mp4 +``` + +Maybe this looks great to you, but if you haven't worked with FFmpeg before, this probably looks pretty alien. + +If you're like me and find Python to be powerful and readable, it's easy with `ffmpeg-python`: +``` +import ffmpeg + +in_file = ffmpeg.file_input('input.mp4') +joined = ffmpeg.concat( + ffmpeg.trim(in_file, start_frame=10, end_frame=20), + ffmpeg.trim(in_file, start_frame=30, end_frame=40), + ffmpeg.trim(in_file, start_frame=50, end_frame=60) +) +out = ffmpeg.file_output(joined, 'output.mp4') +out.run() +``` + +`ffmpeg-python` takes care of running `ffmpeg` with the command-line arguments that correspond to the above filter diagram, and it's easy to what's going on and make changes as needed. + +Real-world signal graphs can get a heck of a lot more complex, and `ffmpeg-python` doesn't care. + diff --git a/doc/graph1.png b/doc/graph1.png new file mode 100644 index 0000000000000000000000000000000000000000..36846c801364c628bf9dbef70df289881f8f1307 GIT binary patch literal 29268 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 literal 0 HcmV?d00001 diff --git a/ffmpeg.py b/ffmpeg.py index 5b9903b..0f4363c 100755 --- a/ffmpeg.py +++ b/ffmpeg.py @@ -5,6 +5,7 @@ import hashlib import json import operator import subprocess +import sys def _create_root_node(node_class, *args, **kwargs): @@ -27,13 +28,13 @@ class _Node(object): @classmethod def _add_operator(cls, node_class): - if getattr(node_class, 'STATIC', False): + if not getattr(node_class, 'STATIC', False): + def func(self, *args, **kwargs): + return _create_child_node(node_class, self, *args, **kwargs) + else: @classmethod def func(cls2, *args, **kwargs): return _create_root_node(node_class, *args, **kwargs) - else: - def func(self, *args, **kwargs): - return _create_child_node(node_class, self, *args, **kwargs) setattr(cls, node_class.NAME, func) @classmethod @@ -233,13 +234,14 @@ NODE_CLASSES = [ _Node._add_operators(NODE_CLASSES) - -for node_class in NODE_CLASSES: - if getattr(node_class, 'STATIC', False): +_module = sys.modules[__name__] +for _node_class in NODE_CLASSES: + if getattr(_node_class, 'STATIC', False): func = _create_root_node else: func = _create_child_node - globals()[node_class.NAME] = partial(func, node_class) + func = partial(func, _node_class) + setattr(_module, _node_class.NAME, func) def get_args(node):