2017-03-16 41 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);