J'essaie de créer des miniatures à partir de vidéos externes, principalement des MP4 et des fichiers FLV. J'utilise FFmpegPHP. J'ai déjà la génération de vignettes fonctionnant bien, cependant, je dois d'abord charger la vidéo sur mon serveur. Serait-il possible de diffuser seulement une petite partie de la vidéo, puis d'en extraire la vignette?FFmpegPHP obtenir la vignette de l'URL externe
Voici le code que j'ai jusqu'à présent:
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');
Toute personne a une suggestion?
EDIT
Comme Brad suggéré, voici le code mis à jour:
$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);
, je Jusqu'à présent, peut extraire une vignette sans avoir à télécharger le tout. Cependant, j'espérais obtenir le cadre du milieu (ish) si possible. Puis-je simplement avancer mon flux et écrire 0 jusqu'à ce que j'atteigne le milieu du flux, et juste obtenir des informations autour de cela. Aussi, est-il possible de calculer combien de temps j'ai besoin de télécharger un fichier pour obtenir des informations? – jValdron
@jValdron, Pour les flux MPEG, vous pouvez souvent sauter juste au milieu. Beaucoup d'autres codecs et conteneurs permettent la même chose. Vous pouvez utiliser une requête de plage pour spécifier les octets souhaités. Voir aussi: http://stackoverflow.com/a/8507991/362536 La plupart des serveurs le supportent. Pour obtenir la longueur, vous pouvez faire une demande 'HEAD' (où soutenu), ou' GET', puis annuler après avoir reçu l'en-tête de longueur. – Brad
Merci pour votre temps avec ce Brad. Maintenant, je ai juste besoin de comprendre comment obtenir l'image du milieu :) – jValdron