gpt4 book ai didi

php - 基于 PHP 通过 HTTP 从录制文件流式传输实时视频

转载 作者:可可西里 更新时间:2023-11-01 15:08:37 26 4
gpt4 key购买 nike

我想通过基于 PHP 的 HTTP 组织来自录制文件的直播。

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

问题: 我使用以下 header 通过 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 上也能运行?

最佳答案

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

set_time_limit(0);

关于php - 基于 PHP 通过 HTTP 从录制文件流式传输实时视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42837461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com