2013-05-13 2 views
0

У меня есть сайт трубки и им с помощью этой функции, чтобы генерировать большие пальцы из видеофайлаImageMagick создает большие пальцы

$thumbwidth = 240; //thumb width 
$thumbheight = 180; //thumb height 

$imagick_command = "-modulate 110,102,100 -sharpen 1x1 -enhance"; 

shell_exec("$ffmpeg_path -ss $first -i \"".$row[file]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -s ".$thumbwidth."x".$thumbheight." \"$image\""); 

shell_exec("/usr/local/bin/mogrify $imagick_command $image"); 

Здесь приводят большие пальцы, это изображение только то, что я не нужен, нет границы и т.д ..

enter image description here

, но иногда в зависимости от видео у меня есть большие пальцы, как это

enter image description here

Что лучший способ, чтобы удалить это черное пространство с больших пальцев, но нужно держать размер большого пальца рук 240x180

+0

Я просто проверял мою версию FFmpeg с фиксированным изменением размера 'FFmpeg -ss 1 -i GOPR9876.MP4 -vcodec MJPEG -vframes 1 -an -f rawvideo -s 400x100 «foo3.jpg» «Я не получаю никаких черных границ. Что странно. Установлено ли ваше исходное видео как анаморфное или что-то еще? – Danack

+0

Или еще более забавно, черные граничат с фактическим видео? – Danack

ответ

1

Вам нужно:

  1. Изменения размера изображения с FFmpeg сохранения пропорций, так что не добавляет никаких границ. Который -vf scale=".$thumbwidth.":trunc(ow/a/2)*2 внизу.

  2. Изменение размера изображения до требуемого точного размера. Который -resize ".$thumbwidth."x".$thumbheight."\! ниже.

Таким образом, новый набор команд должен выглядеть следующим образом:

$thumbwidth = 240; //thumb width 
$thumbheight = 180; //thumb height 

$imagick_command = "-modulate 110,102,100 -sharpen 1x1 -enhance -resize ".$thumbwidth."x".$thumbheight."\!"; 

shell_exec("$ffmpeg_path -ss $first -i \"".$row[file]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=".$thumbwidth.":trunc(ow/a/2)*2 \"$image\""); 

shell_exec("/usr/local/bin/mogrify $imagick_command $image"); 

Проверено на FFmpeg с билда с прошлого сентября с параметрами, заданными в качестве фактических значений, чтобы сделать его легче читать:

ffmpeg -ss 1 -i GOPR9876.MP4 -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=240:trunc\(ow/a/2\)*2 "foo.jpg" 
+0

Хм есть проблема с этой строкой 'shell_exec (" $ ffmpeg_path -ss $ first -i \ "". $ Row [файл]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale = ". $ thumbwidth.": trunc (ow/a/2) * 2 \ "$ image \" ");' журналы говорят: создавая большой палец # 0 на секунду: 1 ... Сбой! Невозможно создать эскиз! –

+0

Он работает для меня после того, как я ускользнул от круглых скобок(). – Danack

+0

Да, я уже пытаюсь использовать 'scale = 240: trunc \ (ow/a/2 \) * 2', но понятия не имею, в чем проблема: –

0

Используйте фильтр масштаба ffmpeg, чтобы создать эскиз, переполненный площадью 240x180 точек.

Представьте, что у вас есть видео размером 320x256 пикселей. Чтобы получить ширину 240, вам нужно масштабировать с коэффициентом 0,75. Чтобы получить высоту 180, вам нужно масштабировать с 0,70. Если вы берете максимум два фактора, вы получите миниатюру размером 240x192, переполняющую целевую область без каких-либо черных границ.

Далее сделайте центральную культуру, чтобы получить идеальное изображение 240x180, удалив 6px вверх и вниз.

Если высота видео была больше ее ширины, математика такая же. После изменения размера вы получите миниатюру с высотой 180 и несколько большей шириной, и урожай займет центральную часть, что сделает ее идеальной.

С FFmpeg, вы можете использовать масштаб и обрезки фильтры в цепочке фильтров:

-vf scale='iw*max(240/iw\, 180/ih):-1', crop=240:180` 

Вы должны использовать escapeshellarg() при создании строки командной строки из внешних входов. Вот PHP код, который вы можете использовать:

<?php 

// static configuration - safe 
$thumbwidth = 240; 
$thumbheight = 180; 
$ffmpeg_path = 'ffmpeg'; 

// foreign input - unsafe 
$first = '00:00:30'; 
$row = array('file' => '/home/goran/File Name.avi'); 
$image = '/home/goran/File Name.jpg'; 

$cmd = sprintf('%s ' . 
    '-ss %s -i %s -vcodec mjpeg -vframes 1 -an -f rawvideo ' . 
    '-vf scale=\'iw*max(%d/iw\, %d/ih):-1\', crop=%d:%d '. 
    '%s', 
    $ffmpeg_path, 
    escapeshellarg($first), escapeshellarg($row['file']), 
    $thumbwidth, $thumbheight, $thumbwidth, $thumbheight, 
    escapeshellarg($image)); 

shell_exec($cmd); 
+0

Вы хотите запустить что-то вроде этого из командной строки 'ffmpeg -ss 50 -i 2.flv -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale = 'iw * max (240/iw \, 180/ih): - 1' -vf crop = '240: 180' "1.jpg" ' ? –

+0

Да. Работает? У меня ffmpeg версия 1.0.7. –

+0

Yea thumbs created, но снова с черными границами ... hmmm .. возможно мне нужно создать такой же размер больших пальцев, как на youtube, если я вижу, что youtube генерирует 16: 9 превью ..? –

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