【问题标题】:Live video streaming from recording files over HTTP based on PHP基于 PHP 通过 HTTP 录制文件的实时视频流
【发布时间】:2017-03-16 14:50:46
【问题描述】:

我想通过基于 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);

并冲洗如下:

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 机制来实现,或者我应该使用其他方式?


更新:基于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 上运行?

【问题讨论】:

  • 您是否尝试过应用来自this question的代码?
  • @MifReal 感谢您的评论!我试了一下并更新了问题。你能查一下吗?

标签: php http streaming video-streaming vlc


【解决方案1】:

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

set_time_limit(0);

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多