<?php | |
/** | |
* Description of VideoStream | |
* | |
* @author Rana | |
* @link http://codesamplez.com/programming/php-html5-video-streaming-tutorial | |
*/ | |
class VideoStream | |
{ | |
private $path = ""; | |
private $stream = ""; | |
private $buffer = 102400; | |
private $start = -1; | |
private $end = -1; | |
private $size = 0; | |
function __construct($filePath) | |
{ | |
$this->path = $filePath; | |
} | |
/** | |
* Open stream | |
*/ | |
private function open() | |
{ | |
if (!($this->stream = fopen($this->path, 'rb'))) { | |
die('Could not open stream for reading'); | |
} | |
} | |
/** | |
* Set proper header to serve the video content | |
*/ | |
private function setHeader() | |
{ | |
ob_get_clean(); | |
header("Content-Type: video/mp4"); | |
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 Satisfiable'); | |
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); | |
exit; | |
} | |
/** | |
* 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(); | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
I play only 40 second of video? Why? |
This comment has been minimized.
This comment has been minimized.
Very useful. Thank you. |
This comment has been minimized.
This comment has been minimized.
Very nice! solved my problems :) |
This comment has been minimized.
This comment has been minimized.
May be an idea to add a if(connection_aborted()) near line 104 or as part of the while(). |
This comment has been minimized.
This comment has been minimized.
all type video formats are not supported in this code... so please any body help me for all types of video supported streaming code.. |
This comment has been minimized.
This comment has been minimized.
Very nice! But The user reload video when streaming ... |
This comment has been minimized.
This comment has been minimized.
too much helpful ,thanks alot..... |
This comment has been minimized.
This comment has been minimized.
How to use the code & where to replace the video path plzz let me know |
This comment has been minimized.
This comment has been minimized.
@ranacseruet |
This comment has been minimized.
This comment has been minimized.
Thank you! |
This comment has been minimized.
This comment has been minimized.
@ranacseruet Thanks for this script! I just noticed that video streaming with this does not work on Android 5 and 6 devices... Any ideas? |
This comment has been minimized.
This comment has been minimized.
Thank you, very nice solution |
This comment has been minimized.
This comment has been minimized.
Very nice class ! |
This comment has been minimized.
This comment has been minimized.
@ranacseruet It's possible to stream multiple video files in one php script? $stream1 = new VideoStream($file1); $stream2 = new VideoStream($file2); If I try the following code, the script is just serving the first video file. Of course I removed the exit's in the class |
This comment has been minimized.
This comment has been minimized.
@annopnod Why are you making an extra variable? Turn this: Into this: You are never going to use EDIT: A better way you could do this, is use an array. Line 39 with the I added on line 16, the video formats allowed for html(could be more than listed): On line 39 or the |
This comment has been minimized.
This comment has been minimized.
I would like to use this code in a GNU GPLv3 licensed project. Can you please license this code as GNU GPLv3 ? |
This comment has been minimized.
This comment has been minimized.
Hello, how to use this class in codeigniter? I tried but I didn't response. Regards |
This comment has been minimized.
This comment has been minimized.
This basically just saved my life. Thank you. |
This comment has been minimized.
This comment has been minimized.
Hello, This is a really awesome class you've done here. But I am asking myself if there is a way to find when the video ends streaming ? Thank you a lot. |
This comment has been minimized.
This comment has been minimized.
Hello, the seeking don't working on chrome. I think you need to change line 48 : |
This comment has been minimized.
This comment has been minimized.
Hi. Add this statement in stream method before while: session_write_close(). Without it, the browser freezes when a file is streaming when you make new requests, like click to go to another page for example. Before I use session_write_close(), a new request only worked in Firefox. In another browsers all new requests make browser keeps loading until the stream finishes. |
This comment has been minimized.
This comment has been minimized.
If you're using PHP5+ remove Line 76 ( Line 109 change to tested on Chrome, Safari and FF |
This comment has been minimized.
This comment has been minimized.
Is there an option to stream multiple video files one after the other, like it is for audio files? |
This comment has been minimized.
This comment has been minimized.
Hello guys. I had same error in IE11. To solve this issue you need add header("Accept-Ranges: bytes"); after 83 string. |
This comment has been minimized.
This comment has been minimized.
It only plays 2 - 4 seconds of the video on both desktop and iphone. But seems to still download the file. |
This comment has been minimized.
This comment has been minimized.
I have used the above code in my website. When i refresh the page again and again then video play from starting, this is not a video live streaming. How to implement the video live streaming please tell me? |
This comment has been minimized.
This comment has been minimized.
I don't understand what the point of this is. Perhaps I am missing something. However, rather than using all this heavy machinery to display a video, why not just put the path to the video into the src of the html video element? |
This comment has been minimized.
This comment has been minimized.
@ImSeaWorld
|
This comment has been minimized.
This comment has been minimized.
Thank you that was so helpfull |
This comment has been minimized.
This comment has been minimized.
My Video is 285 MB. I am trying to play using video streaming from aws server. It is playing directly on aws s3 server. But not able to play directly from video streaming. |
This comment has been minimized.
This comment has been minimized.
Hello I want to load subtitles in it. how can I do it? |
This comment has been minimized.
This comment has been minimized.
Will this script stop streaming if close the player? I have a suspicion that it will output the data until the end of file is reached. Am I correct? regards |
This comment has been minimized.
This comment has been minimized.
video is not working |
This comment has been minimized.
This comment has been minimized.
Thank you that was so helpfull, but it's possible to play the video in a <\video> element ? |
This comment has been minimized.
This comment has been minimized.
How to prevent this file from being downloaded??? |
This comment has been minimized.
This comment has been minimized.
Thank you very helpfull |
This comment has been minimized.
This comment has been minimized.
I want to stream a .mp4 but it wont work and gives no error messages I have this code:
videostream.php: Already solved it the mp4 file was to big |
This comment has been minimized.
This comment has been minimized.
|
This comment has been minimized.
This comment has been minimized.
Thank you for this script |
This comment has been minimized.
This comment has been minimized.
A while ago, I was looking for a stream server. I really did try to find a solution for that, to no avail. Lo and behold, today it occurred to me that "may be" there was a script available that would cover my needs. So, I did search for one first in PHP (I can handle python, but I'm a lot more proficient in PHP) and I found this. I gotta say, man. What a surprise. This one works flawlessly, and covered completely my needs (that happen to be quite special). Dude, I'm incredible grateful for this. |
This comment has been minimized.
This comment has been minimized.
Dear Ranacseruet If the streaming starts i cannot leave the page until the video has loaded completely. Is there a way to stop the streaming if a visitor wants to leave the page ? (It happens in chrome, in firefox you can leave the page) |
This comment has been minimized.
This comment has been minimized.
how did you use that ? |
This comment has been minimized.
This comment has been minimized.
1- Download the DownloadStream.php 5- Copy and paste the video you would like to stream in the same root (same location as your VideoStream and index files) |
This comment has been minimized.
This comment has been minimized.
I'm having some issues. |
This comment has been minimized.
This comment has been minimized.
Can someone put an example on how to stream aws S3 video using this VideoStreamer class? |
This comment has been minimized.
This comment has been minimized.
I am using the |
This comment has been minimized.
This comment has been minimized.
hi, I'm using your code, I made just a little mod. It work very well on windows (all browser), but in MACOS (all browser) the video does not play. any idea? thanks |
This comment has been minimized.
This comment has been minimized.
Is there a way to use this and prevent users from downloading the video? The video can be downloaded by just right clicking after the entire video has been played. I am looking for a way to prevent it from being downloaded (like streaming services use). |
This comment has been minimized.
line 39: header("Content-Type: video/mp4");
cannot play .webm file format
you should add:
$ext = strtolower(pathinfo($this->path, PATHINFO_EXTENSION));
switch ($ext)
{
case "mp4":
header("Content-Type: video/mp4");
break;
case "webm":
header("Content-Type: video/webm");
break;
}