2017-03-16 54 views
13

Tôi muốn tổ chức phát trực tiếp từ việc ghi tệp qua HTTP dựa trên PHP.

GIỚI THIỆU: Trên máy chủ phát, tôi viết video vào tệp cục bộ (local_file.mpg) và khi nhận được yêu cầu từ máy khách, sau đó bắt đầu phát trực tuyến từ
$start_byte = filesize("local_file.mpg")-10MB; Local_file.mpg vẫn đang viết và tập lệnh PHP tiếp tục đọc và đỏ bừng.

VẤN ĐỀ: Tôi luồng nó qua HTTP Tầm bay với các tiêu đề sau:
Phát video trực tiếp từ ghi tệp qua HTTP dựa trên PHP

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

Và đỏ bừng như sau:

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

tôi mở nó thông qua VLC hoặc FFplay, nhưng nó chơi cho đến khi thời điểm khi luồng được yêu cầu. Điều này được mong đợi, bởi vì chúng tôi xác định kích thước của tệp và cung cấp cho bên yêu cầu. Nhưng nếu chúng tôi tăng kích thước tệp một cách giả tạo, ví dụ:
$size = filesize("local_file.mpg")+999999999999; cũng không hữu ích, vì trình phát video yêu cầu dữ liệu mới quá sớm khi không được ghi lại. Và cũng dừng chơi vào thời điểm khi luồng được yêu cầu.

1. Vui lòng tư vấn cách chỉnh sửa phát trực tiếp tổ chức từ ghi tệp qua HTTP dựa trên PHP.
2. Có thể làm điều đó với cơ chế RANGE HTTP hoặc tôi nên sử dụng một cách khác?


UPDATE: Dựa trên this question Tôi đã thử các mã tiếp theo:

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

Và nó hoạt động tốt qua ffplay, nhưng qua VLC nó chơi không còn nữa sau đó 1 phút và sau đó ngừng.
Xin vui lòng tư vấn làm thế nào để làm cho nó hoạt động trên VLC cũng?

+1

Bạn đã cố gắng áp dụng mã từ [câu hỏi này] (http://stackoverflow.com/questions/32459509/php-recording-a-live-streaming -to-a-file)? – MifReal

+0

@MifReal Cảm ơn bạn đã bình luận! Tôi đã thử và cập nhật câu hỏi. Bạn có thể kiểm tra không? –

Trả lời

3

Bạn có giới hạn thời gian thực thi php không? nếu có, thay đổi nó để không giới hạn với:

set_time_limit(0); 
Các vấn đề liên quan