PHP + 用于实时视频流的 cURL(cURL 可以处理无限数据吗?)

PHP + cURL for live video streaming (can cURL work with infinite data?)

美好的一天!
我有具有不同流的视频服务器和客户端正在与之通信的服务器。我的目标是根据请求制作一个脚本转到特定流,获取一大块数据并将该大块返回给客户端。
我的想法与this类似:使用cURL进行授权,捕获一些原始数据并创建回调函数回显每个块的数据。

问题是我没有找到任何关于使用 cURL 和 "endless data" 的提及;当我用我的脚本尝试它时,它会永远加载,然后因 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);
}

它适用于图片(来自同一台服务器),cURL 错误没有回显,所以无限源中有问题,我怀疑 headers 中有问题。我已经通过浏览器检查了 headers 视频服务器的响应,但在我的解决方案中找不到任何被忽视的错误。 这是来自视频服务器的 headers:

回复Headers

Connection: keep-alive
Content-Type: video/mp4
Date: Wed, 30 May 2018 07:31:34 GMT
Server: nginx/1.12.2
Transfer-Encoding: chunked

请求Headers

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: <...>

来自 here 的解决方案我也试过了,但是
1) 我已经用“3000 万个字符”答案解释了我的问题 C:
2) HTTP_RANGE 的解决方案也不适合我(我试过),因为同样的错误:长时间加载和崩溃。

UPD. 我想我错过了 "Content-Range:" header;最后你可以在不知道大小的情况下使用它,像这样:"bytes 1024-2047/*",但我还不知道如何正确使用它。

我知道问题出在哪里了。 我的代码正在运行,不需要任何其他 headers,除了 cURL 选项:

CURLOPT_FOLLOWLOCATION => 1 

是的,cURL 可以 处理无限数据。 Here 通过 cURL 进行视频代理的工作解决方案,如果其他人有兴趣的话。