реклама

сряда, 12 май 2010 г.

SWF thumbnail



Днес открих начин и реших да го споделя. Тъп е, но върши работа с много, ама много криви писаници и идеята, че скрийншотовете ще се правят на windows машина.
За flv няма проблем- качвате си ffmpeg-dev, има php-ffmpeg в нета, дето работи с библиотеката и дава достъп до инфо, кадри и т.н. Не съм тествал 100%, но стъпките биха били с exec да се конвертира .flv до .avi, ако случайно не работи направо с .flv, и после да се действа от php. PECL е, та иска да не е на хостинг машина. .swf не работят с тоя начин.
Та... Ето и как става flv. Има проектче за четене на екран от IE през php. В phpclasses е първото, което излиза при търсене на screenshot. Теглите го. Слагате го на XP с WAMP примерно. Тук аз ползвам виртуална машина по Ubuntu. В администрацията на XPто давате Services и на Apache в log on позволявате "Allow this service to interact with desktop". Проектчето иска COM подръжка в php, но WAMP я има. Рестартирате Apache и може да правите screenshot от IE. Вече може да взимаме кадри от .SWF. Проблемът е, че повечето игри имат малко реклами, та... Ето един patch, който чака 30 секунди да се отиде на нормален екран:

В screenshot.class.php добавяме в класа горе
public $sleep=0;

Редактираме следната функция:
public function navigate( $url = 'about:blank' )
{
$url = ( $url ) ? $url : 'about:blank';
$this->IE->Navigate( ($url) ? $url : 'about:blank' );
$this->url = $url;
$time = time();

if ($this->sleep){
set_time_limit(100);
sleep($this->sleep);
}
while ( $this->IE->ReadyState != '4' and $time + 2 > time() )
{
$this->pump();
}
if ( $this->pump )
{
$this->pump( 1000 );
}
return true;
}
Тук мой е кодът за sleep.


Правим си shot.php, който ще генерира картинката.

require_once('screenshot.class.php');

class_exists('screenshot') or die('screenshot class does not exist.');

$screen = new screenshot(false, 768, 1024);
$screen->sleep= 30;
$screen->navigate('http://hot2.kefche.net/games/d67wtx.swf');
$screen->title('You can set custom titles too (and custom body if you want)');
$screen->position(0, 0);
$screen->screenshot();
$screen->output();
$screen->save('image.jpg');
$screen->quit();

unset($screen);


Вече имаме нещо, което в cron може да се вика с опашка и да прави картинки. Лесно се прави wrapper да записва картинките в thumb папка на основния сървър. Заради забавянето няма как да не се вика това чудо на 2-3 минути поне. Важното е, че поне е действащ начин.
Има и някакъв wrapper за Mozilla под Linux в phpclasses. Там пак ще трябва да се мисли изчакване. Не мога да го подкарам, защото нямам libxul под Ubuntuто. На клипче с демо вади shot, като в X стартира Firefox.
Намерих и трети вариант, дето с някаква сложнотия с 5-6 python пакета прави конвертиране на .swf в avi и после може да се ползва ffmpeg, но там ubuntu запецна на инсталацията на пакетите.

Най-вероятно ще ползвам нещо такова за система за upload на игри на games сайта. Ще видим... Сега няма време за това. Просто днес ми дойде да търся решение на проблем, който в google не намерих някой да е разрешил лесно или поне да го сподели. Беше си добра почивка за 3-4 часа от другите задачи.

1 коментар:

  1. Преди време, ми се наложи да решавам подобен проблем, и въпреки че не стигнах до готов код, тествах следната идея:

    Има един екстеншън за Firefox, който прави моментна снимка на цялата страница или на видимата част.

    http://pearlcrescent.com/products/pagesaver/

    Би трябвало да върви на Ubunto, въпреки че съм го тествал само под Windows. Добрата новина е, че може да се вика от командната линия (заедно с Firefox), има много опции, като тази да изчаква малко, и снима и флаш съдържание, лошата е, че "про" версията струва $15. Всъщност цената си заслужава.

    Иначе принципа е както ти предлагаш - викаш с "exec" Firefox-a, заедно с необходимите параметри: URL, закъснение, каква част от екрана да запише, къде да сложи файла ...

    Според мен, решение базирано на Ubunto/Firefox би било по-стабилно от IE/Windows/COM/PHP

    ОтговорИзтриване