Ffmpeg用固定宽度改变高度

时间:2012-03-02 08:26:51

标签: php ffmpeg video-processing

我正在尝试使用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)我需要在退出时获得视频,如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字符串中添加他们的代码部分时犯了错误)

帮我改进代码

由于

3 个答案:

答案 0 :(得分:4)

如果ffmpeg支持视频过滤器,那么您可以使用scale过滤器并将视频大小调整为640像素宽度并按比例更改高度,如下所示:

exec($ ffmpegPath。“ - i”。$ srcFile。“ - ar 22050 -ab 32 -f flv -vf scale = 640:ih * 640 / iw”。$ destFile,$ tmp);

答案 1 :(得分:2)

我自己遇到过这个问题,最后我编写了自己的函数(用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不接受宽度或高度的奇数。

答案 2 :(得分:2)

我不会精通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;