Genellikle MP4 ve FLV gibi harici videolardan küçük resimler oluşturmaya çalışıyorum. FFmpegPHP kullanıyorum. Küçük resim nesli zaten çalışıyor, ancak önce videoyu tamamen sunucuma yüklemem gerekiyor. Videonun sadece küçük bir kısmını oynatmak mümkün mü yoksa küçük resmi oradan mı çıkarmak mümkün olabilir?FFmpegPHP, dış URL'den küçük resmi al
İşte kod var bugüne kadar var:
require_once PRIV . 'Vendor/FFmpegPHP/FFmpegAutoloader.php';
// Download the whole video.
$video = file_get_contents($_PUT['video']);
$file = 'path_to_cache';
file_put_contents($file, $video);
$movie = new FFmpegMovie($file);
// Generate the thumbnail.
$thumb = $movie->getFrame($movie->getFrameCount()/2);
$thumb->resize(320, 240);
imagejpeg($thumb->toGDImage(), 'path_to_thumb');
Herkes bir önerisi var?
$file = CACHE . 'moodboard_video_' . rand();
$fh = fopen($file, 'w');
$size = 0;
curl_setopt($ch, CURLOPT_URL, $_PUT['video']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) use($fh, &$size){
$length = fwrite($fh, $data);
if($length === FALSE) {
return 0;
} else {
$size += $length;
}
// Downloads 1MB.
return $size < 1024 * 1024 * XXXXXX ? $length : 0;
});
curl_exec($ch);
fclose($fh);
curl_close($ch);
// Create the thumbnail.
$thumb = $movie->getFrame(XXXXXX);
$thumb->resize(static::DEFAULT_THUMBNAIL_WIDTH, $thumb->getHeight()/$thumb->getWidth() * static::DEFAULT_THUMBNAIL_WIDTH);
$image = $thumb->toGDImage();
imagejpeg($image, PRIV . static::THUMBNAILS_PATH . $item->getLastInsertIdentifier() . '_' . static::DEFAULT_THUMBNAIL_WIDTH);
Şimdiye kadar, hepsini indirmek zorunda kalmadan bir küçük resim elde edebilirsiniz. Ancak, mümkünse orta (ish) çerçeveyi almayı umuyordum. Akımımı bir şekilde ileri aktarabilirim ve akıntının ortasına gelene kadar 0 yazabilirim ve bunun hakkında bilgi alabilirim. Ayrıca, bir dosyadan bilgi almak için ne kadar süre indirmem gerektiğini hesaplamanın bir yolu var mı? – jValdron
@jValdron, MPEG akışları için, genellikle sadece ortada atlayabilirsiniz. Diğer birçok codec ve konteyner aynı izin verir. İstediğiniz baytları belirtmek için aralık isteği kullanabilirsiniz. Ayrıca bkz: http://stackoverflow.com/a/8507991/362536 Çoğu sunucu bunu desteklemektedir. Uzunluğunu elde etmek için, "HEAD" isteği (desteklenen yerlerde) veya "GET" komutunu yapabilir ve uzunluk başlığını aldıktan sonra iptal edebilirsiniz. – Brad
Bu Brad ile geçirdiğiniz zaman için teşekkürler. Şimdi, sadece orta kareyi nasıl alacağımı anlamaya ihtiyacım var :) – jValdron