FFMPEG Cálculo / otimização de taxa de bits

Eu escrevi o seguinte wrapper para FFMPEG:

function Video($input, $crop = null, $scale = null, $output = null, $extra = null)
{
    $input = @new ffmpeg_movie($input);

    if ((is_object($input) === true) && ($input->hasVideo() === true))
    {
        $size = array($input->getFrameWidth(), $input->getFrameHeight());
        $crop = array_values(array_filter(explode('/', $crop), 'is_numeric'));
        $scale = array_values(array_filter(explode('*', $scale), 'is_numeric'));

        if ((is_callable('shell_exec') === true) && (is_executable($ffmpeg = trim(shell_exec('which ffmpeg'))) === true))
        {
            if (count($crop) == 2)
            {
                $crop = array($size[0] / $size[1], $crop[0] / $crop[1]);

                if ($crop[0] > $crop[1])
                {
                    $size[0] = round($size[1] * $crop[1]);
                }

                else if ($crop[0] < $crop[1])
                {
                    $size[1] = round($size[0] / $crop[1]);
                }

                $crop = array($input->getFrameWidth() - $size[0], $input->getFrameHeight() - $size[1]);
            }

            else
            {
                $crop = array(0, 0);
            }

            if (count($scale) >= 1)
            {
                if (empty($scale[0]) === true)
                {
                    $scale[0] = round($scale[1] * $size[0] / $size[1] / 2) * 2;
                }

                else if (empty($scale[1]) === true)
                {
                    $scale[1] = round($scale[0] * $size[1] / $size[0] / 2) * 2;
                }
            }

            else
            {
                $scale = array(round($size[0] / 2) * 2, round($size[1] / 2) * 2);
            }

            $result = array();

            if (array_product($scale) > 0)
            {
                $result[] = sprintf('%s -i %s', escapeshellcmd($ffmpeg), escapeshellarg($input->getFileName()));

                if (array_sum($crop) > 0)
                {
                    if (stripos(shell_exec(escapeshellcmd($ffmpeg) . ' -h | grep crop'), 'removed') !== false)
                    {
                        $result[] = sprintf('-vf "crop=in_w-2*%u:in_h-2*%u"', round($crop[0] / 4) * 2, round($crop[1] / 4) * 2);
                    }

                    else if ($crop[0] > 0)
                    {
                        $result[] = sprintf('-cropleft %u -cropright %u', round($crop[0] / 4) * 2, round($crop[0] / 4) * 2);
                    }

                    else if ($crop[1] > 0)
                    {
                        $result[] = sprintf('-croptop %u -cropbottom %u', round($crop[1] / 4) * 2, round($crop[1] / 4) * 2);
                    }
                }

                if ($input->hasAudio() === true)
                {
                    $result[] = sprintf('-ab %u -ar %u', $input->getAudioBitRate(), $input->getAudioSampleRate());
                }

                $result[] = sprintf('-b %u -r %u -s %s', $input->getBitRate(), min(25, $input->getFrameRate()), implode('x', $scale));

                if (strlen($format = strtolower(ltrim(strrchr($output, '.'), '.'))) > 0)
                {
                    $result[] = sprintf('-f %s %s -y %s', $format, escapeshellcmd($extra), escapeshellarg($output . '.ffmpeg'));

                    if ((strncmp('flv', $format, 3) === 0) && (is_executable($flvtool2 = trim(shell_exec('which flvtool2'))) === true))
                    {
                        $result[] = sprintf('&& %s -U %s %s', escapeshellcmd($flvtool2), escapeshellarg($output . '.ffmpeg'), escapeshellarg($output . '.ffmpeg'));
                    }

                    $result[] = sprintf('&& mv -u %s %s', escapeshellarg($output . '.ffmpeg'), escapeshellarg($output));

                    if ((is_writable(dirname($output)) === true) && (is_resource($stream = popen('(' . implode(' ', $result) . ') 2>&1 &', 'r')) === true))
                    {
                        while (($buffer = fgets($stream)) !== false)
                        {
                            if (strpos($buffer, 'to stop encoding') !== false)
                            {
                                return (is_int(pclose($stream)) === true) ? true : false;
                            }
                        }

                        if (is_file($output . '.ffmpeg') === true)
                        {
                            unlink($output . '.ffmpeg');
                        }

                        pclose($stream);
                    }
                }
            }
        }
    }

    return false;
}

Como você pode ver, estou usando a taxa de bits original de áudio e vídeo de entrada na minha saída, mesmo que o vídeo de entrada seja cortado ou redimensionado, o que parece bastante ineficiente em termos de espaço em H

Eu sei muito pouco sobre esses assuntos, mas, pelo que entendi, as taxas de bits estão diretamente ligadas à duração, qualidade e resolução da mídia, certo? Nesse caso, como posso usar esses valores para determinar uma taxa de bits apropriada de áudio e vídeo para manter a qualidade da entrada e reduzir o tamanho do arquivo?

Desde já, obrigado

questionAnswers(3)

yourAnswerToTheQuestion