【问题标题】:Video thumbnail视频缩略图
【发布时间】:2010-12-01 06:58:09
【问题描述】:

我正在开发一个人们可以提交视频链接的网站。然后我只是嵌入它。但是,我想获取视频的缩略图而不将视频保存在我的服务器中。这样当我列出视频时,我可以使用缩略图而不是嵌入所有视频。

我的服务使用 PHP。假设视频是 SWF 格式。

or 标记中是否有任何我可以“抓取”缩略图的内容?或者在 PHP 中,有什么可以远程获取远程视频的缩略图(或帧)的吗?

有什么想法吗?

【问题讨论】:

  • 这取决于服务。您想支持哪些服务?
  • "我的服务使用 PHP。假设视频是 SWF 格式。"我假设您的意思是使用 Flash/swf 播放器嵌入远程站点的 FLV 视频?如果是这样,您需要能够提取 .flv 文件的 url,将其下载到服务器上的临时位置并使用 FFMPEG 提取拇指。老实说,我没有看到任何其他方法可以做到这一点。
  • Vimeo、YouTube 和其他服务提供了获取缩略图的方法无需下载整个 flv、对其进行解码和提取帧。
  • 嗯.. 我知道 Youtube 有 API 可以做到这一点,但其他网站没有。我的网站让人们可以链接来自任何来源的视频。这就是挑战。 :D

标签: php video thumbnails


【解决方案1】:

您可以使用“ffmpeg”。使用 PHP 调用它。

shell_exec  ("ffmpeg -i \"$FILENAME.flv\" -ss 00:00:04 -f image2 \"$FILENAME.jpg\"");

对不起,我没有测试它,所以先试试吧。

编辑: 只是为了好玩,我把它变成了一个函数。这里是:

<?php
 
function GetThumbnailFileName($FileName, $ScreenShortSecond = 10) {
    $VDOLastModifiedDate = filemtime($FileName);
    $Thumbnail_FileName  = sprintf("%s-(%s::%02d).jpg", $FileName, $VDOLastModifiedDate, $ScreenShortSecond);
     
    if (!file_exists($Thumbnail_FileName)) {
        $FFMPEG_Command = sprintf(
            "ffmpeg -i \"%s\" -y -ss \"00:00:%02d\" -f image2 \"%s\" > /dev/null 2>&1",
            $FileName, 0 + $ScreenShortSecond, $Thumbnail_FileName
        );
        system($FFMPEG_Command);
    }
     
    if (!file_exists($Thumbnail_FileName))
        return null;
     
    return $Thumbnail_FileName;
}
 
$FileName  = "Test.flv";
$Thumbnail = GetThumbnailFileName($FileName);
if ($Thumbnail != null)
     echo "Thumbnail file is: \"$Thumbnail\"\n";
else echo "Fail creating a Thumbnail of \"$FileName\".";
 
?>

此功能还缓存缩略图,并确保在修改 VDO 时重新创建更新缩略图。

享受

【讨论】:

  • 嗯,但是,我需要在服务器中有文件吗?如果它只是远程服务器中的一个链接怎么办?另外,我需要完整的视频吗?
  • 没关系..感谢您的帮助。 :)
【解决方案2】:

我使用上面的一些 sn-ps 和其他一些来源让它工作,这是我的一些代码:

    private function videoScreenshot($originalFile, $newFile, $percentage = 10)
    {
        // Check ffmpeg is configured
        $config = Nutshell::getInstance()->config;
        $ffmpeg_dir = $config->plugin->Plupload->ffmpeg_dir;
        if(!$ffmpeg_dir) return;

        // Get the potision a percentage of the way in the video
        $duration = $this->getVideoDuration($originalFile);
        $position = ($duration * ($percentage / 100));

        // save the screenshot
        $command = "\"{$ffmpeg_dir}ffmpeg\" -i \"$originalFile\" -ss $position -f image2 \"$newFile\"";
        shell_exec($command);
    }

    private function getVideoDuration($filename, $seconds = true)
    {
        $config = Nutshell::getInstance()->config;
        $ffmpeg_dir = $config->plugin->Plupload->ffmpeg_dir;
        if(!$ffmpeg_dir) return;

        ob_start();
        $command = "\"{$ffmpeg_dir}ffmpeg\" -i \"$filename\" 2>&1";
        passthru($command);
        $result = ob_get_contents();
        ob_end_clean();

        preg_match('/Duration: (.*?),/', $result, $matches);
        $duration = $matches[1];

        if($seconds)
        {
            $duration_array = explode(':', $duration);
            $duration = $duration_array[0] * 3600 + $duration_array[1] * 60 + $duration_array[2];
        }
        return $duration;
    }

显然,如果您要在自己的类中使用这些函数,则需要替换这些行

    $config = Nutshell::getInstance()->config;
    $ffmpeg_dir = $config->plugin->Plupload->ffmpeg_dir;

使用您自己的配置选项。

完整的pluginframework 可以在github 上找到,这个sn-p 来自的特定文件是here

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2023-04-05
    • 2010-12-13
    • 2012-02-23
    • 2018-12-21
    • 2015-03-26
    • 2011-05-30
    • 2010-11-05
    • 2012-09-01
    相关资源
    最近更新 更多