【问题标题】:Ffmpeg change height with fixed widthffmpeg 用固定宽度改变高度
【发布时间】:2012-03-20 18:29:43
【问题描述】:

我正在尝试使用 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 字符串中添加他们的代码部分时犯了错误)

请帮助我改进我的代码

谢谢

【问题讨论】:

  • 规模过滤器,正如您已经调查过并且 Dmitry Shkuropatsky 建议的那样,可能是您想要的,但是您没有包含您尝试使用规模的完整 ffmpeg 输出,所以我只能猜测你的 FFmpeg 可能太旧了。

标签: php ffmpeg video-processing


【解决方案1】:

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

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

【讨论】:

  • 好吧,看起来我的 ffmpeg build dt 支持 -vf 命令:(我将使用 php 和图像工作类手动计算大小,无论如何感谢您的帮助)
【解决方案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 不接受宽度或高度的奇数。

【讨论】:

    【解决方案3】:

    我不会流利地使用 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;
    

    【讨论】:

    • 是的,如果没有命令字符串解决方案,我将不得不手动计算尺寸,但我相信存在 cstring 解决方案 - ffmpeg dt 拥有它太奇怪了=\。
    • 好消息是,如果不设置输出文件,ffmpeg 会立即退出。但它只会在回显有关流的信息后才会这样做,因此您自己执行此操作意味着很少的开销。
    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2016-07-10
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多