我想通过基于 PHP 的 HTTP 录制文件组织实时流。
简介:在流媒体服务器上,我将视频写入本地文件(local_file.mpg),当收到来自客户端的请求时,然后开始从$start_byte = filesize("local_file.mpg")-10MB;
流式传输到它local_file.mpg仍在
写入,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 范围机制或我应该使用其他方式?
更新:基于这个问题,我尝试了下一个代码:
<?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?
你有 php 执行的时间限制吗? 如果是,请使用以下命令将其更改为无限制:
set_time_limit(0);