我想基於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上工作呢?
你試圖從[這個問題](http://stackoverflow.com/questions/32459509/php-recording-a-live-streaming申請代碼-to-A-文件)? – MifReal
@MifReal感謝您的評論!我試過並更新了這個問題。你能檢查嗎? –