Create MP4 video thumbnail with php GD

I am using GD image library to load videos, but I cannot create thumbnail, is there a way to create a thumbnail of mp4 video file using php gb image library?

this is my code; is it possible to embed 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 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 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;
}

}

      

+3


source to share


3 answers


No, you cannot do this with GD.

Take a look at the documentation

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

You only have the following functions imagecreatefrom*

:

imagecreatefromgd2
imagecreatefromgd2part
imagecreatefromgd
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromstring
imagecreatefromwbmp
imagecreatefromwebp
imagecreatefromxbm
imagecreatefromxpm

      

No video format. So no, this 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 shared environments, but if you look at the contract for this, you can see that video hosting is prohibited.

Of course, there is another possibility as well, but I cannot imagine PHP just a path.

+2


source


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");

      

+2


source


yes you can use ffmpeg.

  • install ffmpeg on your server.
  • check the example code.

extension_loaded ('ffmpeg') or die ('Error 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';

}

      

+1


source







All Articles