<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run(self, input_data=None, stdout=None, stderr=None):
 """Execute FFmpeg command line. ``input_data`` can contain input for FFmpeg in case ``pipe`` protocol is used for input. ``stdout`` and ``stderr`` specify where to redirect the ``stdout`` and ``stderr`` of the process. By default no redirection is done, which means all output goes to running shell (this mode should normally only be used for debugging purposes). If FFmpeg ``pipe`` protocol is used for output, ``stdout`` must be redirected to a pipe by passing `subprocess.PIPE` as ``stdout`` argument. Returns a 2-tuple containing ``stdout`` and ``stderr`` of the process. If there was no redirection or if the output was redirected to e.g. `os.devnull`, the value returned will be a tuple of two `None` values, otherwise it will contain the actual ``stdout`` and ``stderr`` data returned by ffmpeg process. More info about ``pipe`` protocol `here <https://ffmpeg.org/ffmpeg-protocols.html#pipe>`_. :param str input_data: input data for FFmpeg to deal with (audio, video etc.) as bytes (e.g. the result of reading a file in binary mode) :param stdout: redirect FFmpeg ``stdout`` there (default is `None` which means no redirection) :param stderr: redirect FFmpeg ``stderr`` there (default is `None` which means no redirection) :return: a 2-tuple containing ``stdout`` and ``stderr`` of the process :rtype: tuple :raise: `FFRuntimeError` in case FFmpeg command exits with a non-zero code; `FFExecutableNotFoundError` in case the executable path passed was not valid """

        try:
            self.process = subprocess.Popen(
                self._cmd,
                stdin=subprocess.PIPE,
                stdout=stdout,
                stderr=stderr
            )
        except OSError as e:
            if e.errno == errno.ENOENT:
                raise FFExecutableNotFoundError("Executable '{0}' not found".format(self.executable))
            else:
                raise

        out = self.process.communicate(input=input_data)
        if self.process.returncode != 0:
            raise FFRuntimeError(self.cmd, self.process.returncode, out[0], out[1])

        return out