MP4 Video Thumbnail create using php GD

12,533

Solution 1

No you can't do this using GD.

Take a look into the Documentation

http://php.net/manual/de/book.image.php

You have only the following imagecreatefrom* functions:

imagecreatefromgd2
imagecreatefromgd2part
imagecreatefromgd
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromstring
imagecreatefromwbmp
imagecreatefromwebp
imagecreatefromxbm
imagecreatefromxpm

There Is no video format. So no, it is not possible.

Take a look at FFMpeg and consider this library:

FFMpeg: https://www.ffmpeg.org/

PHP Library: https://github.com/PHP-FFMpeg/PHP-FFMpeg/

Sure it is not installed in most of shared environments, but if you take a look into the contract of this, you will see, that video hosting is disallowed.

Sure there are other Possibility, but i can't imagine a PHP only way.

Solution 2

Use this simple code:

$video_path = 'D:\xampp\htdocs/test.mp4';
$video_image_dir = 'D:\xampp\htdocs/';
$video_name = 'teat.mp4';
$time_in_seconds = round(1 / 2); 
exec("ffmpeg -vframes 1 -ss " . $time_in_seconds . " -i " . $video_path . " " . $video_image_dir . $video_name . ".jpg -y 2> " . $video_image_dir . $video_name . ".txt");

Solution 3

yes it is possible using ffmpeg.

  • install ffmpeg in your server.
  • check below example code.

extension_loaded('ffmpeg') or die('Error in loading ffmpeg');

// $vid = realpath('./video/Wildlife.wmv');

$video_url = 'http://download.wavetlan.com/SVV/Media/HTTP/H264/Talkinghead_Media/H264_test1_Talkinghead_mp4_480x360.mp4';

$image_filename = 'images/' . time() . ".jpg";

$movie = new ffmpeg_movie($video_url, false);

$frameCount = $movie->getFrameCount();

$capPos = ceil($frameCount / 4);

$frameObject = $movie->getFrame($capPos);

if ($frameObject) {

    $frameObject->resize(500, 250, 0, 0, 0, 0);

    imagejpeg($frameObject->toGDImage());

} else {

    echo 'error';

}
Share:
12,533
aydcery
Author by

aydcery

Updated on June 04, 2022

Comments

  • aydcery
    aydcery almost 2 years

    I am using GD image library to upload videos but I can not create any thumbnail, is there any way to create mp4 video file thumbnail using php gb image library?

    this is my code; is it possible to entegrate ffmpeg ?

    <?php
    if(isset($_POST))
    {
    
    ############ Edit settings ##############
    $ThumbSquareSize        = 400; //Thumbnail will be 200x200
    $ThumbPrefix            = "thumb_"; //Normal thumb Prefix
    $DestinationDirectory   = 'uploads/'; //specify upload directory ends with / (slash)
    $Quality                = 90; //jpeg quality
    ##########################################
    
    //check if this is an ajax request
    if (!isset($_SERVER['HTTP_X_REQUESTED_WITH'])){
        die();
    }
    
    // check $_FILES['ImageFile'] not empty
    if(!isset($_FILES['ImageFile']) || !is_uploaded_file($_FILES['ImageFile']['tmp_name']))
    {
            die('Something wrong with uploaded file, something missing!'); // output error when above checks fail.
    }
    
    // Random number will be added after image name
    $RandomNumber   = rand(0, 9999999999); 
    
    $ImageName      = str_replace(' ','-',strtolower($_FILES['ImageFile']['name'])); //get image name
    $ImageSize      = $_FILES['ImageFile']['size']; // get original image size
    $TempSrc        = $_FILES['ImageFile']['tmp_name']; // Temp name of image file stored in PHP tmp folder
    $ImageType      = $_FILES['ImageFile']['type']; //get file type, returns "image/png", image/jpeg, text/plain etc.
    
    //Let's check allowed $ImageType, we use PHP SWITCH statement here
    switch(strtolower($ImageType))
    {
        case 'video/mp4':
            break;
        default:
            die('Unsupported File!'); //output error and exit
    }
    
    //PHP getimagesize() function returns height/width from image file stored in PHP tmp folder.
    //Get first two values from image, width and height. 
    //list assign svalues to $CurWidth,$CurHeight
    list($CurWidth,$CurHeight)=getimagesize($TempSrc);
    
    //Get file extension from Image name, this will be added after random name
    $ImageExt = substr($ImageName, strrpos($ImageName, '.'));
    $ImageExt = str_replace('.','',$ImageExt);
    
    //remove extension from filename
    $ImageName      = preg_replace("/\\.[^.\\s]{3,4}$/", "", $ImageName); 
    
    //Construct a new name with random number and extension.
    $NewImageName = $ImageName.'-'.$RandomNumber.'.'.$ImageExt;
    $pageurl = 'http://'.@$_SERVER['HTTP_HOST'].strtr(dirname($_SERVER['SCRIPT_NAME']), '\\', '/').'';
    //set the Destination Image
    $thumb_DestRandImageName    = $DestinationDirectory.$ThumbPrefix.$NewImageName; //Thumbnail name with destination directory
    $DestRandImageName          = $DestinationDirectory.$NewImageName; // Image with destination directory
    
    //Resize image to Specified Size by calling resizeImage function.
    if(move_uploaded_file($_FILES['ImageFile']['tmp_name'], $DestinationDirectory.$NewImageName ))
    {
        //Create a square Thumbnail right after, this time we are using cropImage() function
        if(!resizeImage($CurWidth,$CurHeight,$ThumbSquareSize,$thumb_DestRandImageName,$Quality,$ImageType))
            {
                echo 'Error Creating thumbnail';
            }
        /*
        We have succesfully resized and created thumbnail image
        We can now output image to user's browser or store information in the database
        */
    $variable = <<<XYZ
    <div class="kingimgupload">
    <iframe src="$pageurl/uploads/$NewImageName" alt="Resized Image"></iframe>
    <img src="$pageurl/uploads/$ThumbPrefix$NewImageName" alt="Resized Image">
    </div>
    XYZ;
    echo $variable;
        /*
        // Insert info into database table!
        mysql_query("INSERT INTO myImageTable (ImageName, ThumbName, ImgPath)
        VALUES ($DestRandImageName, $thumb_DestRandImageName, 'uploads/')");
        */
    
    }else{
        die('Resize Error'); //output error
    }
    }
    
    
    // This function will proportionally resize image 
    function         resizeImage($CurWidth,$CurHeight,$MaxSize,$DestFolder,$SrcImage,$Quality,$ImageType)
    {
    //Check Image size is not 0
    if($CurWidth <= 0 || $CurHeight <= 0) 
    {
        return false;
    }
    
    //Construct a proportional size of new image
    $ImageScale         = min($MaxSize/$CurWidth, $MaxSize/$CurWidth); 
    $NewWidth           = ceil($ImageScale*$CurWidth);
    $NewHeight          = ceil($ImageScale*$CurHeight);
    $NewCanves          = imagecreatetruecolor($NewWidth, $NewHeight);
    
    // Resize Image
    if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $NewWidth, $NewHeight, $CurWidth, $CurHeight))
    {
        switch(strtolower($ImageType))
        {
            case 'video/mp4':
                imagepng($NewCanves,$DestFolder);
                break;
            default:
                return false;
        }
    //Destroy image, frees memory   
    if(is_resource($NewCanves)) {imagedestroy($NewCanves);} 
    return true;
    }
    
    }
    
  • Hartmut Pfarr
    Hartmut Pfarr almost 9 years
    using ffmpeg is clever :-)