2017-03-16 8 views
13

PHP 기반의 HTTP를 통해 파일을 녹화하는 라이브 스트리밍을 구성하고 싶습니다.

소개 : : 스트리밍 서버에서 로컬 파일 (local_file.mpg)에 비디오를 작성하고 클라이언트로부터 요청을 받으면
$start_byte = filesize("local_file.mpg")-10MB;에서 스트리밍을 시작합니다. local_file.mpg은 여전히 ​​작성 중이며 PHP 스크립트는 계속 읽고 있습니다. 홍조.

문제 : 나는 다음과 같은 헤더를 HTTP 범위를 통해 스트리밍는 :
PHP를 기반으로 HTTP를 통해 파일을 녹화하는 라이브 비디오 스트리밍

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를 통해 엽니 다,하지만 때까지 연주 :

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); 

그리고 플래시는 다음과 같이 스트림이 요구 된 시각. 이것은 우리가 파일의 크기를 결정하고 요청 된쪽에 제공하기 때문에 예상된다. 그러나 우리가 인위적으로 파일 크기를 늘리면 (예 :
$size = filesize("local_file.mpg")+999999999999;) 비디오 플레이어가 새 데이터를 너무 빨리 요청하기 때문에 너무 빨리 녹화되지 않기 때문에 도움이되지 않습니다. 그리고 스트림이 요청 된 시점에 재생을 중지했습니다.

1. PHP를 기반으로 HTTP를 통해 파일을 녹음하여 라이브 스트리밍을 정리하는 방법을 알려주십시오.
2. HTTP RANGE 메커니즘으로 할 수 있습니까? 아니면 다른 방법을 사용해야합니까?


UPDATE :this question을 바탕으로 나는 다음 코드를 시도 :

<?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에서도 작동하도록 조언 해주세요.

+1

당신은 [이 질문] (http://stackoverflow.com/questions/32459509/php-recording-a-live-streaming의 코드를 적용하는 시도 해 봤나 -to-a-file)? – MifReal

+0

@MifReal 코멘트 주셔서 감사합니다! 나는 그것을 시도하고 질문을 업데이 트했습니다. 확인해 주시겠습니까? –

답변

3

PHP 실행을위한 시간 제한이 있습니까? 예 경우, 무제한으로 변경 :

set_time_limit(0);