我試圖從外部視頻創建縮略圖,主要是MP4和FLV。我正在使用FFmpegPHP。我已經有縮略圖生成工作正常,但是,我需要首先在我的服務器上完全加載視頻。是否有可能僅流式傳輸視頻的一小部分,然後從中提取縮略圖?FFmpegPHP從外部URL獲取縮略圖
下面的代碼我到目前爲止:
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');
任何人有一個建議?
編輯
布拉德建議,這裏是更新後的代碼:
$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);
到目前爲止,我可以提取的縮略圖,而無需下載整個事情。但是,如果可能的話,我希望能夠獲得中間(ish)幀。我可以以某種方式推進我的流,然後寫0直到我到達流的中間,只是獲得有關信息。另外,有什麼方法可以計算我需要下載文件以從中獲取信息的時間? – jValdron
@jValdron,對於MPEG流,你可以經常跳到中間。許多其他編解碼器和容器也允許相同。你可以使用範圍請求來指定你想要的字節。另請參閱:http://stackoverflow.com/a/8507991/362536大多數服務器都支持它。爲了獲得長度,你可以做'HEAD'請求(如果支持的話)或'GET',然後在你收到長度標題後取消。 – Brad
感謝您與布拉德共度時光。現在,我只需要弄清楚如何獲得中間框架:) – jValdron