基于PHP的基于HTTP的录制文件实时视频流

Iva*_*kov 13 php streaming http vlc video-streaming

我想基于PHP组织基于HTTP的录制文件的实时流式传输.

简介:在流媒体服务器上,我将视频写入本地文件(local_file.mpg),当收到来自客户端的请求,然后从
$start_byte = filesize("local_file.mpg")-10MB; local_file.mpg 开始流式传输,仍在编写,PHP脚本继续读取并刷新.

问题:我通过HTTP Range使用以下标头进行流式传输:

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);
Run Code Online (Sandbox Code Playgroud)

冲洗如下:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

1.请建议如何根据PHP纠正通过HTTP记录文件组织实时流式传输.
2.是否可以使用HTTP RANGE机制进行,或者我应该使用其他方式?


更新:基于这个问题,我尝试了下一个代码:

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

它通过ffplay运行良好,但通过VLC,它不会超过1分钟,然后停止.
请告知如何让它在VLC上运行?

Ehs*_*shi 5

php 执行有时间限制吗?如果是,请将其更改为无限制:

set_time_limit(0);
Run Code Online (Sandbox Code Playgroud)