Подтвердить что ты не робот

Прямая передача видео в потоковом режиме из файлов записи через HTTP на основе PHP

Я хочу организовать прямую трансляцию из записи файлов через HTTP на основе PHP.

ВВЕДЕНИЕ. На потоковом сервере я пишу видео в локальный файл (local_file.mpg) и получая запрос от клиента, затем начинайте с него потоковое вещание с $start_byte = filesize("local_file.mpg")-10MB;. local_file.mpg все еще пишет, а PHP скрипт продолжает читать и промывать.

ПРОБЛЕМА: Я передаю его через HTTP-диапазон со следующими заголовками:

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. Пожалуйста, совет, как правильно организовать прямую трансляцию из записи файлов через HTTP на основе PHP.
2. Можно ли это сделать с помощью механизма HTTP RANGE, или я должен использовать другой способ?


ОБНОВЛЕНИЕ: На основе этого вопроса Я попробовал следующий код:

<?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?

4b9b3361

Ответ 1

У вас есть лимит времени на выполнение php? если да, измените его на неограниченное с помощью:

set_time_limit(0);