简体   繁体   English

ffmpeg-php创建视频缩略图

[英]ffmpeg-php to create thumbnail of video

I am trying to use this script to create thumbnail of a video using ffmpeg . 我正在尝试使用此脚本使用ffmpeg创建视频缩略图。 At first I used phpinfo(); 起初我使用了phpinfo(); and I found ffmpeg is installed on my server. 我发现ffmpeg安装在我的服务器上。

Then I copied ffmpeg-php onto my server and run the test file 然后我将ffmpeg-php复制到我的服务器上并运行测试文件

I got to know that many function are working on my server 我知道很多功能正在我的服务器上运行

I got output like this 我有这样的输出

Output:- 输出: -

Functions available in /usr/lib/php/extensions/no-debug-non-zts-20060613/ffmpeg.so extension:

Methods available in class ffmpeg_movie:
__construct
getduration
getframecount
getframerate
getfilename
getcomment
gettitle
getauthor
getartist
getcopyright
getalbum
getgenre
getyear
gettracknumber
getframewidth
getframeheight
getframenumber
getpixelformat
getbitrate
hasaudio
hasvideo
getnextkeyframe
getframe
getvideocodec
getaudiocodec
getvideostreamid
getaudiostreamid
getaudiochannels
getaudiosamplerate
getaudiobitrate
getvideobitrate
getpixelaspectratio
getpixelaspectratio
getvideobitrate
getaudiobitrate
getaudiosamplerate
getaudiochannels
getaudiostreamid
getvideostreamid
getaudiocodec
getvideocodec
getframe
getnextkeyframe
hasvideo
hasaudio
getbitrate
getpixelformat
getframenumber
getframeheight
getframewidth
gettracknumber
getyear
getgenre
getalbum
getcopyright
getartist
getauthor
gettitle
getcomment
getfilename
getframerate
getframecount
getduration
__construct

I wrote this code and tried any possible path to assign $ffmpeg; 我编写了这段代码并尝试了任何可能的路径来分配$ffmpeg;

<?php

    $thumb_stdout;
    $retval=0;
    $ffmpeg = '/home/lib/ffmpeg';

// change "demo.mpg" to your mpg file name!
$video  = dirname(__FILE__) . 'demo.mpg';

// change "demo.jpg" to whichever name you like or don't
// for this example, the name of the output jpg file does not matter
$image  = dirname(__FILE__) . 'demo.jpg';

$second = 1;

$cmd = "$ffmpeg -i $video 2>&1";
if (preg_match('/Duration: ((\d+):(\d+):(\d+))/s', '$cmd', $time)) {
    $total = ($time[2] * 3600) + ($time[3] * 60) + $time[4];
    $second = rand(1, ($total - 1));
}

//$cmd = "$ffmpeg -i $video -deinterlace -an -ss $second -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg $image 2>&1";
$cmd = "$ffmpeg -i $video -r 1 -ss 00:00:05 -t 00:00:01 -s 250x250 -f image2 $image";
echo $cmd;
exec($cmd);
//$return = '$cmd';

echo '<br>done!';
?>

At last I got the code thanks to Anubhaw .Your link helped lot.Try this code. 最后我得到了代码感谢Anubhaw。你的链接帮了很多。试试这段代码。

            //thumb path should be added in the below code
            //test for thumb
            $dir_img='uploads/';
            $mediapath='123.jpg';
            $file_thumb=create_movie_thumb($dir_img.$mediapath,$mediapath,$mediaid);

            $name_file=explode(".",$mediapath);
            $imgname="thumb_".$name_file[0].".jpg";     

            /*
              Function to create video thumbnail using ffmpeg
            */
            function create_movie_thumb($src_file,$mediapath,$mediaid)
            {
                global $CONFIG, $ERROR;

                $CONFIG['ffmpeg_path'] = '/usr/local/bin/'; // Change the path according to your server.
                $dir_img='uploads/';
                $CONFIG['fullpath'] = $dir_img."thumbs/";

                $src_file = $src_file;
                $name_file=explode(".",$mediapath);
                $imgname="thumb_".$name_file[0].".jpg";
                $dest_file = $CONFIG['fullpath'].$imgname;

                if (preg_match("#[A-Z]:|\\\\#Ai", __FILE__)) {
                    // get the basedir, remove '/include'
                    $cur_dir = substr(dirname(__FILE__), 0, -8);
                    $src_file = '"' . $cur_dir . '\\' . strtr($src_file, '/', '\\') . '"';
                    $ff_dest_file = '"' . $cur_dir . '\\' . strtr($dest_file, '/', '\\') . '"';
                } else {
                    $src_file = escapeshellarg($src_file);
                    $ff_dest_file = escapeshellarg($dest_file);
                }

                $output = array();

                if (eregi("win",$_ENV['OS'])) {
                    // Command to create video thumb
                    $cmd = "\"".str_replace("\\","/", $CONFIG['ffmpeg_path'])."ffmpeg\" -i ".str_replace("\\","/" ,$src_file )." -an -ss 00:00:05 -r 1 -vframes 1 -y ".str_replace("\\","/" ,$ff_dest_file);
                    exec ("\"$cmd\"", $output, $retval);

                } else {
                    // Command to create video thumb
                    $cmd = "{$CONFIG['ffmpeg_path']}ffmpeg -i $src_file -an -ss 00:00:05 -r 1 -vframes 1 -y $ff_dest_file";
                    exec ($cmd, $output, $retval);

                }


                if ($retval) {
                    $ERROR = "Error executing FFmpeg - Return value: $retval";
                    if ($CONFIG['debug_mode']) {
                        // Re-execute the command with the backtick operator in order to get all outputs
                        // will not work if safe mode is enabled
                        $output = `$cmd 2>&1`;
                        $ERROR .= "<br /><br /><div align=\"left\">Cmd line : <br /><span style=\"font-size:120%\">" . nl2br(htmlspecialchars($cmd)) . "</span></div>";
                        $ERROR .= "<br /><br /><div align=\"left\">The ffmpeg program said:<br /><span style=\"font-size:120%\">";
                        $ERROR .= nl2br(htmlspecialchars($output));
                        $ERROR .= "</span></div>";
                    }
                    @unlink($dest_file);
                    return false;
                }

                $return = $dest_file;
                //@chmod($return, octdec($CONFIG['default_file_mode'])); //silence the output in case chmod is disabled
                return $return;
            }

Enjoy Coding 享受编码

with regards, 带着敬意,

Wasim 瓦西姆

Looked over the code, made it simpler and runnable, maybe this helps some of you. 查看代码,使其更简单和可运行,也许这有助于你们中的一些人。

class VideoTile
{
    public static function createMovieThumb($srcFile, $destFile = "test.jpg")
    {
        // Change the path according to your server.
        $ffmpeg_path = 'D:\\ffmpeg\\bin\\';

        $output = array();

        $cmd = sprintf('%sffmpeg -i %s -an -ss 00:00:05 -r 1 -vframes 1 -y %s', 
            $ffmpeg_path, $srcFile, $destFile);

        if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN'))
            $cmd = str_replace('/', DIRECTORY_SEPARATOR, $cmd);
        else
            $cmd = str_replace('\\', DIRECTORY_SEPARATOR, $cmd);

        exec($cmd, $output, $retval);

        if ($retval)
            return false;

        return $destFile;
    }
}

Usage is 用法是

$file = VideoTile::createMovieThumb("../video3.mp4");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM