2017-03-16 39 views
13

我想基于PHP组织基于HTTP的录制文件实时流媒体。

介绍:在我写的视频到本地文件(local_file.mpg),当收到来自客户端的请求,然后开始从
$start_byte = filesize("local_file.mpg")-10MB;的local_file.mpg流给它的流媒体服务器仍在写作和PHP脚本,请继续阅读并潮红。

问题:我通过HTTP范围与下列头流式传输:
基于PHP的基于HTTP的录制文件实时视频流

header('HTTP/1.1 206 Partial Content'); 
header("Content-Type: video/mpeg"); 
header('Content-Length: '.($seek_end - $seek_start)); 
header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$size); 

和冲洗如下:

while(!feof($fp)){ 
    $buf_size = 1024*8; 
    $pos = ftell($fp); 
    if ($pos >= $item["to_byte"]){ 
      fclose($fp); 
      break; 
    } 

    if ($pos + $buf_size > $item["to_byte"]){ 
     $buf_size = $item["to_byte"] - $pos; 
    } 

    if ($buf_size > 0){ 
     echo fread($fp, $buf_size); 
    } 

    flush(); 
    ob_flush(); 
} 

我通过VLC或FFplay打开它,但它玩到流请求的时刻。这是可以预料的,因为我们确定文件的大小并将其提供给请求方。但是,如果我们人为地增加文件大小,例如
$size = filesize("local_file.mpg")+999999999999;这也没有帮助,因为视频播放器在未记录时太早请求新数据。并且在请求流的时刻也停止播放。

1.请建议如何通过基于PHP的HTTP在记录文件中纠正组织实况流。
2.是否可以使用HTTP RANGE机制来完成,或者我应该使用其他方法?


UPDATE:基于this question我试了下代码:

<?php 

$file = "online.mpg"; 

function flush_buffers(){ 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
} 

header('Content-Type: video/mpeg'); 
$stream = fopen($file, "rb"); 
fseek($stream, (filesize($file)-10000000), SEEK_SET); 

while(1){ 
    $response = fread($stream, 8192); 
    echo $response; 
    flush_buffers(); 
} 

fclose($stream); 
exit(); 
?> 

它通过ffplay运作良好,但通过VLC发挥它没有更多的则1分钟后,采空。
请咨询如何使它在VLC上工作呢?

+1

你试图从[这个问题](http://stackoverflow.com/questions/32459509/php-recording-a-live-streaming申请代码-to-A-文件)? – MifReal

+0

@MifReal感谢您的评论!我试过并更新了这个问题。你能检查吗? –

回答

3

你有执行php的时间限制吗? 如果是,它改变为无限:

set_time_limit(0);