FFmpegPHP从外部URL获取缩略图

jVa*_*ron 6 php ffmpeg http video-thumbnails

我正在尝试从外部视频创建缩略图,主要是MP4和FLV.我正在使用FFmpegPHP.我已经将缩略图生成工作正常,但是,我需要先在我的服务器上完全加载视频.是否可以仅流式传输视频的一小部分,然后从中提取缩略图?

这是我到目前为止的代码:

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');
Run Code Online (Sandbox Code Playgroud)

有人有建议吗?

编辑

正如Brad所说,这是更新的代码:

$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);
Run Code Online (Sandbox Code Playgroud)

Bra*_*rad 3

FFMPEG 非常擅长处理损坏的流。因此,我认为您应该尝试下载该远程媒体的前几兆,并尝试从不完整的文件中获取缩略图。

首先,删除file_get_contents()并使用 cURL。您可以将该CURLOPT_WRITEFUNCTION选项设置为您的自定义函数,该函数将逐块写入磁盘上的临时文件。当您收到足够的数据时,0从函数返回,cURL 将停止下载。您必须进行试验才能确定最佳尺寸是多少。如果您获得的数据太少,您将只能使用最早的帧,或者根本没有帧。太晚了,您正在浪费带宽。

对于某些容器类型,文件信息位于文件末尾。对于这些,我没有给你的建议。由于没有编写自己的解码器并在末尾与开头的信息进行拼接,我不知道有什么方法可以在不下载整个文件的情况下做到这一点。