Friday, 12 February 2016

PHP HTML5 video streaming examples

PHP HTML5 video streaming examples

Today, HTML5 video player is being popular. It stream with a given video, If you need to control the streaming from your server script to provide additional facility like ACL/Auth, resume support, sending small videos etc. You can do all with PHP.
Following are PlayVideoStream class, Which you can use
class PlayVideoStream
{
    /** set the private data members **/
    private $path = "";
    private $stream = "";
    private $buffer = 1024000;
    private $start  = -1;
    private $end    = -1;
    private $size   = 0;
    /** set the private data members **/
    
    /** Set the video file path in while creating the object **/
     function __construct($filePath) 
    {
        $this->path = $filePath;
    }
     
    /**
     * Open the file in read mode
     */
    private function open()
    {
        if (!($this->stream = fopen($this->path, 'rb'))) {
            die('Not able to read the file i.e '.$this->path);
        }
         
    }
     
    /**
     * Set  header to serve the video play
     * Here we are getting the mime type dynamically, for this you must enable php_fileinfo extension
     */
    private function setHeader()
    {
        ob_get_clean();
        $result = new finfo();
        $videoType= $result->file($this->path, FILEINFO_MIME_TYPE);  //Get the correct video type
        header("Content-Type: ".$videoType);
        header("Cache-Control: max-age=2592000, public");
        header("Expires: ".gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
        header("Last-Modified: ".gmdate('D, d M Y H:i:s', @filemtime($this->path)) . ' GMT' );
        $this->start = 0;
        $this->size  = filesize($this->path);
        $this->end   = $this->size - 1;
        header("Accept-Ranges: 0-".$this->end);
         
        if (isset($_SERVER['HTTP_RANGE'])) {
  
            $c_start = $this->start;
            $c_end = $this->end;
 
            list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
            if (strpos($range, ',') !== false) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header("Content-Range: bytes $this->start-$this->end/$this->size");
                exit;
            }
            if ($range == '-') {
                $c_start = $this->size - substr($range, 1);
            }else{
                $range = explode('-', $range);
                $c_start = $range[0];
                 
                $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $c_end;
            }
            $c_end = ($c_end > $this->end) ? $this->end : $c_end;
            if ($c_start > $c_end || $c_start > $this->size - 1 || $c_end >= $this->size) {
                header('HTTP/1.1 416 Requested Range Not valid');
                header("Content-Range: bytes $this->start-$this->end/$this->size");
                exit;
            }
            $this->start = $c_start;
            $this->end = $c_end;
            $length = $this->end - $this->start + 1;
            fseek($this->stream, $this->start);
            header('HTTP/1.1 206 Partial Content');
            header("Content-Length: ".$length);
            header("Content-Range: bytes $this->start-$this->end/".$this->size);
        }
        else
        {
            header("Content-Length: ".$this->size);
        }  
         
    }
    
    /**
     * close curretly opened stream
     */
    private function end()
    {
        fclose($this->stream);        die;
    }
     
    /**
     * perform the streaming of calculated range
     */
    private function stream()
    {
        $i = $this->start;
        set_time_limit(0);
        while(!feof($this->stream) && $i <= $this->end) {
            $bytesToRead = $this->buffer;
            if(($i+$bytesToRead) > $this->end) {
                $bytesToRead = $this->end - $i + 1;
            }
            $data = fread($this->stream, $bytesToRead);
            echo $data;
            flush();
            $i += $bytesToRead;
        }
    }
     
    /**
     * Start streaming video content
     */
    function start()
    {
        $this->open();
        $this->setHeader();
        $this->stream();
        $this->end();
    }
}



Question: How to play video with above class?
$filePath='c://wamp/www/project/public_html/videos/myvideoFile.mp4';
//$filePath='c://wamp/www/project/public_html/videos/myvideoFile1.mp3';
//$filePath='c://wamp/www/project/public_html/videos/myvideoFile2.mp4';
//$filePath='c://wamp/www/project/public_html/videos/myvideoFile3.3gp';
$stream = new PlayVideoStream($filePath);
$stream->start();


Wednesday, 10 February 2016

How to Create Thumbnail Images of uploaded image using PHP

How to Create Thumbnail Images of uploaded image using PHP

This tutorial will describe how to create thumbnail images on the fly using PHP while uploading a image. With uploaded of single image you can create different thumbnail with different size of same Image. Here you will Learn how to process a images and create their thumbnails.

System Requirements:
  1. Work for PHP only.
  2. GD library must be installed which you can check with phpinfo() with version of >=GD 2.0.1
  3. Uploading image size should be less than 2MB but if you want to increase then increase the value of "upload_max_filesize", "post_max_size" from php.ini

Code Snippets
   function resize($width, $height, $imageName,$extension) {
        if(empty($width) || empty($height) || empty($imageName) || empty($extension)){
            die('Required parameter is missing');
        }
        $docRoot = getenv("DOCUMENT_ROOT");
        
        /* Get original image x y */
        $tmpNM = $_FILES['files']['tmp_name'];
        
        list($w, $h) = getimagesize($_FILES['files']['tmp_name']);
        /* calculate new image size with ratio */
        $ratio = max($width / $w, $height / $h);
        $h = ceil($height / $ratio);
        $x = ($w - $width / $ratio) / 2;
        $w = ceil($width / $ratio);
        /* new file name */
        $path = $docRoot . '/images/thumb/' . $imageName;

        /* read binary data from image file */
        $imgString = file_get_contents($_FILES['files']['tmp_name']);
        /* create image from string */
        $image = imagecreatefromstring($imgString);
        $tmp = imagecreatetruecolor($width, $height);
        imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h);
        $fileTypes = array('jpg', 'jpeg', 'jpe', 'png', 'bmp', 'gif'); // File extensions
        /* Save image */
        switch ($extension) {
            case 'jpg':
            case 'jpeg':
            case 'jpe':
                imagejpeg($tmp, $path, 100);
                break;
            case 'png':
                imagepng($tmp, $path,0);
                break;
            case 'gif':
                imagegif($tmp, $path, 100);
                break;
            case 'bmp':
                imagewbmp($tmp, $path);
                break;
            default:
                exit;
                break;
        }
        return $path;
        /* cleanup memory */
        imagedestroy($image);
        imagedestroy($tmp);
    }
This function is able to create multiple thumbnail with different sizes of uploaded images.

How to  create thumbnail of 50pxX50px image?
    
    $w='50'; //New image width
    $h='50'; //New image height
    $imageName=$w.'_'.$h.'_'.$_FILES['files']['name']; //Uploaded file Name
    $imageExtensionArray = explode(".", $_FILES['files']['name']);
    $extension=$imageExtensionArray[1];
    $this->resize($w, $h,  "{$imageName}",$extension);

How to create thumbnail of 100pxX100px image?
$w='100'; //New image width
$h='100'; //New image height
$imageName=$w.'_'.$h.'_'.$_FILES['files']['name']; //Uploaded file Name
$imageExtensionArray = explode(".", $_FILES['files']['name']);
$extension=$imageExtensionArray[1];
$this->resize($w, $h,  "{$imageName}",$extension);