Re: Blocking video streaming

From: Date: Mon, 19 Oct 2009 21:27:22 +0000
Subject: Re: Blocking video streaming
References: 1 2 3  Groups: php.general 
Request: Send a blank email to php-general+get-299080@lists.php.net to get a copy of this message
Talawa a écrit :
Kim Madsen a écrit :
Hey Talawa wrote on 2009-10-19 18:29:
Hello everyone, I post a message here because i didn't find any solution yet. I just finished video streaming service on my website. I use xmoov script (http://xmoov.com/xmoov-php/) to do that. It works like a charm, but I find an issue. When the video is buffering into the flash player, all others requests are pending until the video is loaded. I discovered in my search that fopen() function could block php process. Does someone know this problem ?
I've had a similar problem with zip downloads (which also use fopen), I supect either the headers, a caching problem or latin1/utf-8 What does your headers look like? (firefox has a lovely plugin "live http headers") Which character encoding do you use? Show us code bit from fopen to fclose
I forced charset encoding in my htaccess to ISO-8859-1. Here's the http headers I receive : Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0 Pragma: no-cache Last-Modified: Mon, 19 Oct 2009 19:00:33 GMT X-Pad: avoid browser bug Content-Length: 14145470 Vary: User-Agent Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: video/x-flv And here's the php code : if (($fh = fopen($file, 'rb')) === FALSE)
       return;
# assemble packet interval $packet_interval = 0.3; # assemble packet size $packet_size = STREAM_SPEED * 1042; $seekPos = intval($seekPos); $fileSize = filesize($file) - (($seekPos > 0) ? $seekPos + 1 : 0); session_cache_limiter("nocache"); header("Cache-Control: private",false); header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); header("Last-Modified: " . date("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"); header("Pragma: no-cache"); header("Content-Type: video/x-flv"); header("X-Pad: avoid browser bug"); header("Content-Length: " . $fileSize); # FLV file format header if($seekPos != 0) {
       print('FLV');
       print(pack('C', 1));
       print(pack('C', 1));
       print(pack('N', 9));
       print(pack('N', 9));
} # seek to requested file position fseek($fh, $seekPos); # output file while(!feof($fh)) {
       # get start time
       list($usec, $sec) = explode(' ', microtime());
       $time_start = ((float)$usec + (float)$sec);
       # output packet
       print(fread($fh, $packet_size));
       # get end time
       list($usec, $sec) = explode(' ', microtime());
       $time_stop = ((float)$usec + (float)$sec);
       # wait if output is slower than $packet_interval
       $time_difference = $time_stop - $time_start;
       if($time_difference < (float)$packet_interval) {
               usleep((float)$packet_interval * 1000000 - (float)$time_difference * 1000000);
       }
} fclose($fh); Thanks for help.
I solve the issue. I forgot to close the session before sending the stream. Add session_write_close(); before sending. In hope it may help. Cheers.

« previous php.general (#299080) next »