Потоковое видео в реальном времени из записанных файлов по HTTP на основе переполнения стека

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

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

ПРОБЛЕМА: Я транслировал его через 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. Посоветуйте, пожалуйста, как правильно организовать прямую трансляцию из файлов записи по 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?

12

Решение

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

set_time_limit(0);
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]