Ffmpeg изменить высоту с фиксированной шириной - PullRequest
2 голосов
/ 02 марта 2012

Я пытаюсь изменить размеры видео с помощью ffmpeg.Например, пользователь загружает видео 1280 * 960.

И мне нужно получить видео 640 * 480 взамен.

Я попробовал этот код, и он работает

exec($ffmpegPath." -i ".$srcFile." -ar 22050 -ab 32 -f flv -s 640x480".$destFile,$tmp);

но этот метод не поддерживает баланс ширины / высоты видео (т.е. видео 5000 * 480 становится 640 * 480 и выглядит сжатым слева и справа).

В случае этих размеров (5000 * 480) iМне нужно получить видео при выходе, например, 640 * 61, я имею в виду, что фиксированная высота мне не подходит.

Я просматриваю Интернет и нашел эту тему https://superuser.com/questions/201051/resize-videos-with-different-widths-to-a-fixed-height-preserving-aspect-ratio-wi http://delogics.blogspot.com/2011/11/ffmpeg-maintain-aspect-ratio-with-fixed.html

но ни один из них не работает для меня (ffmpeg даже не работает с этим кодом, возможно, я допустил ошибку при добавлении их частей кода в мою строку ffmpeg)

Помогите мне улучшить мой код, пожалуйста,

* 1020.* Спасибо

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

Если ffmpeg поддерживает видеофильтры, вы можете использовать фильтр scale и изменить размер видео до 640 пикселей по ширине и пропорционально измененной высоты следующим образом:

exec ($ ffmpegPath. "-I". $ SrcFile. "-Ar 22050 -ab 32 -f flv -vf scale = 640: ih * 640 / iw". $ DestFile, $ tmp);

2 голосов
/ 02 марта 2012

Я не говорю свободно в ffmpeg, но я не могу найти способ сделать это.Я полагаю, что вместо этого вы можете сделать это в mencoder, или вы можете попытаться определить ширину и высоту видео и рассчитать желаемую высоту самостоятельно.

ob_start();
passthru('ffmpeg -i "'. $srcFile . '" 2>&1');
$output = ob_get_clean();
ob_end_clean();
preg_match('/(\d+)x(\d+)/', $output, $matches);
$width = $matches[1];
$height = $matches[2];
$ratio = $width/640;
$newwidth = 640;
$newheight = $height/$ratio;
2 голосов
/ 02 марта 2012

Я сам столкнулся с этой проблемой и в итоге написал свою собственную функцию (она написана на C ++).

QSize fitTo(QSize originalSize, QSize fitTo)
{
    int width = originalSize.width();
    int height = originalSize.height();
    int fitToWidth = fitTo.width();
    int fitToHeight = fitTo.height();
    if (fitToWidth*height/width/2*2 <= fitToHeight)
    {
        height = fitToWidth*height/width/2*2;
        width = fitToWidth;
    }
    else
    {
        width = fitToHeight*width/height/2*2;
        height = fitToHeight;
    }
    return QSize(width, height);
}

Здесь "/ 2 * 2" не является избыточной, она гарантирует, что числочетное.Ffmpeg не принимает нечетные числа для ширины или высоты.

...