|
from __future__ import unicode_literals |
|
|
|
from past.builtins import basestring |
|
from ._utils import basestring |
|
|
|
from .nodes import ( |
|
filter_operator, |
|
GlobalNode, |
|
InputNode, |
|
MergeOutputsNode, |
|
OutputNode, |
|
output_operator, |
|
) |
|
|
|
|
|
def input(filename, **kwargs): |
|
"""Input file URL (ffmpeg ``-i`` option) |
|
|
|
Any supplied kwargs are passed to ffmpeg verbatim (e.g. ``t=20``, |
|
``f='mp4'``, ``acodec='pcm'``, etc.). |
|
|
|
To tell ffmpeg to read from stdin, use ``pipe:`` as the filename. |
|
|
|
Official documentation: `Main options <https://ffmpeg.org/ffmpeg.html#Main-options>`__ |
|
""" |
|
kwargs['filename'] = filename |
|
fmt = kwargs.pop('f', None) |
|
if fmt: |
|
if 'format' in kwargs: |
|
raise ValueError("Can't specify both `format` and `f` kwargs") |
|
kwargs['format'] = fmt |
|
return InputNode(input.__name__, kwargs=kwargs).stream() |
|
|
|
|
|
@output_operator() |
|
def global_args(stream, *args): |
|
"""Add extra global command-line argument(s), e.g. ``-progress``. |
|
""" |
|
return GlobalNode(stream, global_args.__name__, args).stream() |
|
|
|
|
|
@output_operator() |
|
def overwrite_output(stream): |
|
"""Overwrite output files without asking (ffmpeg ``-y`` option) |
|
|
|
Official documentation: `Main options <https://ffmpeg.org/ffmpeg.html#Main-options>`__ |
|
""" |
|
return GlobalNode(stream, overwrite_output.__name__, ['-y']).stream() |
|
|
|
|
|
@output_operator() |
|
def merge_outputs(*streams): |
|
"""Include all given outputs in one ffmpeg command line |
|
""" |
|
return MergeOutputsNode(streams, merge_outputs.__name__).stream() |
|
|
|
|
|
@filter_operator() |
|
def output(*streams_and_filename, **kwargs): |
|
"""Output file URL |
|
|
|
Syntax: |
|
`ffmpeg.output(stream1[, stream2, stream3...], filename, **ffmpeg_args)` |
|
|
|
Any supplied keyword arguments are passed to ffmpeg verbatim (e.g. |
|
``t=20``, ``f='mp4'``, ``acodec='pcm'``, ``vcodec='rawvideo'``, |
|
etc.). Some keyword-arguments are handled specially, as shown below. |
|
|
|
Args: |
|
video_bitrate: parameter for ``-b:v``, e.g. ``video_bitrate=1000``. |
|
audio_bitrate: parameter for ``-b:a``, e.g. ``audio_bitrate=200``. |
|
format: alias for ``-f`` parameter, e.g. ``format='mp4'`` |
|
(equivalent to ``f='mp4'``). |
|
|
|
If multiple streams are provided, they are mapped to the same |
|
output. |
|
|
|
To tell ffmpeg to write to stdout, use ``pipe:`` as the filename. |
|
|
|
Official documentation: `Synopsis <https://ffmpeg.org/ffmpeg.html#Synopsis>`__ |
|
""" |
|
streams_and_filename = list(streams_and_filename) |
|
if 'filename' not in kwargs: |
|
if not isinstance(streams_and_filename[-1], basestring): |
|
raise ValueError('A filename must be provided') |
|
kwargs['filename'] = streams_and_filename.pop(-1) |
|
streams = streams_and_filename |
|
|
|
fmt = kwargs.pop('f', None) |
|
if fmt: |
|
if 'format' in kwargs: |
|
raise ValueError("Can't specify both `format` and `f` kwargs") |
|
kwargs['format'] = fmt |
|
return OutputNode(streams, output.__name__, kwargs=kwargs).stream() |
|
|
|
|
|
__all__ = ['input', 'merge_outputs', 'output', 'overwrite_output'] |
|
|