2012-03-02 3 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

Фильтр масштаба, как вы уже исследовали, и Дмитрий Шкуропатский предположил, вероятно, что вы хотите, однако вы не указали полный вывод ffmpeg своей попытки использования масштаба, поэтому я могу только предположить, что ваш FFmpeg, вероятно, слишком старый. – LordNeckbeard

ответ

4

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

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

+0

Хорошо, это похоже на мою ffmpeg build dt support -vf command :( Я буду использовать ручной расчет размера с использованием классов php и изображений, спасибо за помощь в любом случае) – Dmitry

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

yes, если нет решения командной строки 'Мне придется вычислять измерения вручную, но я считаю, что решение thst cstring существует - слишком странно, что ffmpeg dt имеет это = \. – Dmitry

+0

Хорошей новостью является то, что если вы не установите выходной файл, ffmpeg выйдет из него. Но это будет сделано только после того, как оно повторит информацию о потоке, поэтому делать это по собственному усмотрению очень мало. –

Смежные вопросы