PHP + cURL для потокового видео (может ли cURL работать с бесконечными данными?) - PullRequest
0 голосов
/ 30 мая 2018

Добрый день!У меня есть видеосервер с разными потоками и сервер, с которым общаются клиенты.Моя цель - сделать так, чтобы скрипт отправлялся в конкретный поток по запросу, брал кусок данных и возвращал этот кусок клиенту.Моя идея похожа на this : использовать cURL для авторизации, перехватывать некоторые необработанные данные и создавать функцию обратного вызова, отображающую данные в каждом фрагменте.Проблема в том, что мне не удалось найти упоминаний об использовании cURL с «бесконечными данными»;когда я пытаюсь сделать это со своим скриптом, он просто загружается вечно, а затем завершается с ошибкой 504 от nginx.Я не понимаю, в чем разница для cURL между моими данными и «длиной 30 миллионов символов», если я использую также buffersize и flush ().Больше никаких введений, вот мой код:

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 отсутствует, поэтому проблема в бесконечном источнике и, я подозреваю, в заголовках.Я проверил заголовки для ответа от видеосервера через браузер, но не могу найти ошибку в моем решении.Вот заголовки с видеосервера:

Заголовки ответа

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

Заголовки запроса

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

Решения от здесь я тоже пробовал, но1) Я уже объяснил свою проблему с помощью ответа «30 миллионов символов» C:2) Решение с HTTP_RANGE не работает и для меня (я пытался) из-за одной и той же ошибки: долгая загрузка и сбой.

UPD. Я думаю, что пропустил "Content-Range:"заголовок;в конце концов, вы можете использовать его, не зная размера, например: "байты 1024-2047 / *", но пока не можете понять, как правильно его использовать в моем случае.

1 Ответ

0 голосов
/ 30 мая 2018

Я разобрался в чем проблема.Мой код работает, мне не нужны никакие другие заголовки, кроме ... this ... little ... cURL option:

CURLOPT_FOLLOWLOCATION => 1 

(arrrrrrGGGHHHHHH и за эти 4 дня моей жизни больше нет??)

Так что да, cURL CAN работает с бесконечными данными. Здесь рабочее решение для проксирования видео через cURL, если кому-то еще интересно.

...