2017-03-16 97 views
13

PHP'ye göre HTTP üzerinden kayıt dosyalarından canlı akış düzenlemek istiyorum.

GİRİŞ: Ben yerel bir dosya (local_file.mpg) ve istemciden bir istek aldığında daha sonra
$start_byte = filesize("local_file.mpg")-10MB; local_file.mpg dan kendisine akışını başlatmak için video yazma akış sunucusunda hala yazıyor ve PHP kodlama yoksa okumaya devam ve yıkama.

SORUN: Aşağıdaki başlıkları içeren HTTP Range aracılığıyla akışını:
Kayıt dosyalarından HTTP üzerinden kayıt üzerinden canlı video akışı

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

Ben VLC veya FFplay aracılığıyla açmak, ancak dek oynanan:

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

Ve yıkama aşağıdaki gibi akış istendiğinde zaman anı. Bu beklenen bir şeydir, çünkü dosyanın boyutunu belirleriz ve istenen tarafa veririz. Ancak, bir dosya boyutunu yapay olarak artırırsak, örneğin
$size = filesize("local_file.mpg")+999999999999; da yardımcı olmaz, çünkü video oynatıcılar kaydedilmediğinde çok erken veri isterler. Ayrıca, akış talep edildiğinde oyun oynamayı durdurdu.

1. Lütfen PHP'ye dayalı HTTP üzerinden kayıt dosyalarından canlı akış düzenlemenin nasıl düzeltileceğini öğrenin.
2. Bunu HTTP RANGE mekanizması ile yapmak mümkün mü yoksa başka bir yol kullanmalı mıyım?


GÜNCELLEME:this question dayanarak sonraki kod çalıştı:

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

Ve ffplay yoluyla iyi çalışıyor, ama VLC aracılığıyla 1 dakika sonra artık oynadı ve sonra stoped.
Ayrıca VLC üzerinde nasıl çalışılmalı?

+1

sen [Bu soruya] (http://stackoverflow.com/questions/32459509/php-recording-a-live-streaming kodu uygulamak denediniz to-a-dosyası)? – MifReal

+0

@MifReal Yorum için teşekkürler! Denedim ve soruyu güncelledim. Lütfen kontrol edebilir misin? –

cevap

3

Php yürütme için bir zaman sınırınız var mı? evet ise, sınırsız olarak değiştirin:

set_time_limit(0);