2012-03-02 195 views
2

我正在尝试使用ffmpeg更改视频尺寸。 例如,用户正在上传视频1280 * 960。固定宽度的Ffmpeg更改高度

而我需要获得视频640 * 480作为回报。

我想这个代码和它的作品

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

但这种方法D'瞒着视频的宽度/高度平衡(即视频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的字符串)

帮助我提高我的代码请

感谢

+0

尺度过滤器,正如你已经调查过的,Dmitry Shkuropatsky提出的可能是你想要的,但是你没有包括你的scale usage的完整ffmpeg输出,所以我只能猜测你的FFmpeg可能是太老。 – LordNeckbeard 2012-03-02 19:26:59

回答

4

如果ffmpeg支持视频过滤器,那么你可以使用scale过滤器和调整视频为640像素宽度和成比例地变化高度如下:

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

+0

好吧,它看起来像我的ffmpeg build dt支持-vf命令:( 我将使用手动大小计算使用PHP和图像工作类,感谢帮助无论如何) – Dmitry 2012-03-06 21:48:11

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

我不是要流利的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; 
+0

是的,如果没有命令字符串解决方案'我将不得不手动计算尺寸,但我相信存在cstring解决方案 - 它太奇怪,ffmpeg dt有它= \。 – Dmitry 2012-03-02 11:31:18

+0

好消息是,如果你没有设置输出文件,ffmpeg会立即退出。但是它只会在回应关于流的信息之后才这样做,所以用你自己的方式来做这件事意味着很少的开销。 – 2012-03-02 12:43:39