Estoy tratando de crear miniaturas de videos externos, principalmente MP4 y FLV. Estoy usando FFmpegPHP. Ya tengo la generación de miniaturas funcionando bien, sin embargo, primero necesito cargar el video completamente en mi servidor. ¿Sería posible transmitir solo una pequeña parte del video y luego extraer la miniatura de eso?FFmpegPHP obtener una miniatura de la URL externa
Aquí está el código que tengo hasta ahora:
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');
Cualquier persona tiene una sugerencia?
EDITAR
Como sugirió Brad, aquí es el código de actualización:
$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);
Hasta el momento, se puede extraer una imagen en miniatura sin tener que descargar todo el asunto. Sin embargo, esperaba obtener el marco intermedio (ish) si es posible. ¿Puedo simplemente avanzar mi flujo de alguna manera y luego escribir 0 hasta que llegue a la mitad de la secuencia y obtener información sobre eso? Además, ¿hay alguna manera de calcular cuánto tiempo necesito descargar un archivo para obtener información de él? – jValdron
@jValdron, para las transmisiones MPEG, a menudo puede simplemente saltar justo en el medio. Muchos otros códecs y contenedores permiten lo mismo. Puede usar una solicitud de rango para especificar qué bytes quiere. Ver también: http://stackoverflow.com/a/8507991/362536 La mayoría de los servidores lo admiten. Para obtener la longitud, puede hacer una solicitud 'HEAD' (donde sea compatible), o' GET' y luego cancelar después de recibir el encabezado de longitud. – Brad
Gracias por su tiempo con este Brad. Ahora, solo necesito averiguar cómo obtener el marco medio :) – jValdron