3

私は、人々がビデオのリンクを送信できるサイトに取り組んでいます。あとは埋め込むだけです。ただし、サーバーに動画を保存せずに動画のサムネイルを取得したいです。そのため、ビデオを一覧表示するときに、すべてのビデオを埋め込む代わりにサムネイルを使用できます。

私のサーブはPHPを使用しています。ビデオが SWF 形式であると仮定します。

サムネイルを「つかむ」ことができるまたはタグに何かありますか? またはPHPで、リモートビデオのサムネイル(またはフレーム)をリモートで取得できるものはありますか?

何か案が?

4

2 に答える 2

11

「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 が変更された場合に更新サムネイルが再作成されるようにします。

楽しみ

于 2009-09-25T01:33:13.627 に答える
1

上記のスニペットと他のソースを使用して動作させました。コードの一部を次に示します。

    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;

独自の構成オプションを使用します。

完全なプラグインフレームワークはgithubで入手できます。このスニペットの元の特定のファイルは、ここにあります。

于 2012-08-16T00:21:49.427 に答える