Ale*_*ult 5 php curl video-streaming
美好的一天!
我有视频服务器与客户正在通信的不同的流和服务器.我的目标是根据请求使脚本转到特定的流,获取一大块数据并将此块返回给客户端.
我的想法与此类似:使用cURL进行授权,捕获一些原始数据并创建回调函数,以回显每个块的数据.
问题是我没有找到任何提及使用cURL的"无穷无尽的数据"; 当我用我的脚本尝试它时,它只是永远加载然后崩溃与来自nginx的504错误.
如果我使用buffersize和flush(),我不明白我的数据与"3000万字符长"之间cURL的区别.
没有更多介绍,这是我的代码:
public function callback($curl, $data)
{
ob_get_clean();
if (($data === false) || ($data == null))
{
throw new Exception (curl_error($curl) . " " . curl_errno($curl));
}
$length = strlen($data);
header("Content-type: video/mp4");
header("Transfer-encoding: chunked");
header("Connection: keep-alive");
header("Cache-Control: max-age=2592000, public");
header("Expires: ".gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
header("Last-Modified: ".gmdate('D, d M Y H:i:s', @filemtime($this->path)) . ' GMT' );
echo $data;
ob_flush();
flush();
return $length;
}
public function getStreamChunk($camera_id)
{
$url = "http://example.com/$camera_id:0:0?format=mp4"; //url of noted video server
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_HEADER => 0,
CURLOPT_USERPWD => "$this->login:$this->pass",
CURLOPT_BUFFERSIZE => (1024*1024),
CURLOPT_WRITEFUNCTION => array($this, "callback")
)
);
curl_exec($curl);
curl_close($curl);
}
Run Code Online (Sandbox Code Playgroud)
它适用于图片(来自同一台服务器),没有cURL错误的回声,所以无限来源的问题,我怀疑,在标题中.我已经通过浏览器检查了来自视频服务器的响应标题,但在我的解决方案中找不到任何被忽视的错误.这是来自视频服务器的标题:
响应标题
Connection: keep-alive
Content-Type: video/mp4
Date: Wed, 30 May 2018 07:31:34 GMT
Server: nginx/1.12.2
Transfer-Encoding: chunked
Run Code Online (Sandbox Code Playgroud)
请求标题
Accept: */*
Accept-Encoding: identity;q=1, *;q=0
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Authorization: Basic <...>
Connection: keep-alive
Cookie: <...>
Host: <...>
Range: bytes=0-
Referer: http://example.com/$camera_id:0:0?format=mp4
User-Agent: <...>
Run Code Online (Sandbox Code Playgroud)
来自这里的解决方案我也尝试了,但是
1)我已经用"30万个字符"解答了我的问题答案C:
2)HTTP_RANGE的解决方案对我来说也不起作用(我试过)因为同样的错误:长时间加载和崩溃.
UPD.我想我错过了"Content-Range:"标题; 最后你可以使用它而不知道大小,像这样:"字节1024-2047/*",但无法弄清楚如何在我的情况下正确使用它.
我已经弄清楚问题出在哪里了。我的代码正在运行,除了 cURL 选项之外,不需要任何其他标头:
CURLOPT_FOLLOWLOCATION => 1
Run Code Online (Sandbox Code Playgroud)
所以,是的,cURL可以处理无限数据。如果其他人感兴趣,这里是通过 cURL 进行视频代理的工作解决方案。