9

Tôi muốn kiểm tra đăng ký của người dùng trước khi cho phép họ xem video, vì lý do này tôi sử dụng PHP để tương tác với Stripe để kiểm tra đăng ký của người dùng và được sử dụng PHP script để phân phát MP4 tới trình duyệtPHP phục vụ MP4 - Chrome "Tiêu đề tạm thời được hiển thị/yêu cầu chưa hoàn thành" lỗi

Hoạt động tốt lần đầu tiên video được phát trong Google Chrome (Sử dụng trình phát HTML5) ... Nhưng khi tôi đóng video và phát lại, video không phát nữa ... Tôi cũng KHÔNG thể tải lại trang hiện tại. Nó giống như máy chủ ngừng hoạt động.

Khi tôi kiểm tra yêu cầu video đầu tiên (video được phát), trong tab Định thời tôi thấy: "THẬN TRỌNG: yêu cầu chưa hoàn tất!" (Ảnh chụp màn hình bên dưới)

CAUTION: request is not finished yet!

Khi tôi kiểm tra theo yêu cầu phim thứ 2 (một trong những không chơi), trong tab Headers nó nói "[cẩn thận dấu] tiêu đề tạm thời được hiển thị" (ảnh chụp màn hình dưới đây)

enter image description here

tất cả mọi thứ đã làm việc như mong đợi trong Safari hay Firefox

bất cứ ai có bất kỳ ý tưởng gì đang xảy ra? Cách duy nhất để phát lại video là đóng tab hiện tại, hãy nhập lại trang web. Tải lại không hoạt động!

+0

Các tệp có cục bộ không? Nếu có - làm thế nào để bạn phục vụ các tập tin của bạn? – divaka

+2

Điều kỳ lạ đối với tôi là tiêu đề 'Phạm vi'. Trong trường hợp của bạn, nó là 'bytes = 0-'. Định dạng tiêu biểu của tiêu đề 'Content-Range' là' byte 0-499/1234' có nghĩa là 500 byte đầu tiên của một tệp có kích thước 1234 byte. Đó là lý do tại sao tôi hỏi làm thế nào để bạn phục vụ các tập tin của bạn, bởi vì bạn cần phải hỗ trợ tải xuống lại/streaming các tập tin của bạn. Kiểm tra điều này để biết thêm thông tin: http://stackoverflow.com/a/4451376/1412896 – divaka

+0

Tài liệu cho phạm vi nội dung tại đây: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html – divaka

Trả lời

1

Tôi khuyên bạn nên sử dụng chức năng sau thay vì 'tập lệnh truyền trực tuyến' hiện tại của bạn. Nếu bạn chuyển $ filename_output, nó sẽ phục vụ tệp dưới dạng tải xuống và nó sẽ phát trực tuyến khác!

Nó sẽ làm việc ở mọi trình duyệt.

serveFile ('/ where/my/vid.mp4');

public function serveFile($filename, $filename_output = false, $mime = 'application/octet-stream') 
{ 
    $buffer_size = 8192; 
    $expiry = 90; //days 
    if(!file_exists($filename)) 
    { 
     throw new Exception('File not found: ' . $filename); 
    } 
    if(!is_readable($filename)) 
    { 
     throw new Exception('File not readable: ' . $filename); 
    } 

    header_remove('Cache-Control'); 
    header_remove('Pragma'); 

    $byte_offset = 0; 
    $filesize_bytes = $filesize_original = filesize($filename); 

    header('Accept-Ranges: bytes', true); 
    header('Content-Type: ' . $mime, true); 

    if($filename_output) 
    { 
     header('Content-Disposition: attachment; filename="' . $filename_output . '"'); 
    } 

    // Content-Range header for byte offsets 
    if (isset($_SERVER['HTTP_RANGE']) && preg_match('%bytes=(\d+)-(\d+)?%i', $_SERVER['HTTP_RANGE'], $match)) 
    { 
     $byte_offset = (int) $match[1];//Offset signifies where we should begin to read the file    
     if (isset($match[2]))//Length is for how long we should read the file according to the browser, and can never go beyond the file size 
     { 
      $filesize_bytes = min((int) $match[2], $filesize_bytes - $byte_offset); 
     } 
     header("HTTP/1.1 206 Partial content"); 
     header(sprintf('Content-Range: bytes %d-%d/%d', $byte_offset, $filesize_bytes - 1, $filesize_original)); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent 
    } 

    $byte_range = $filesize_bytes - $byte_offset; 

    header('Content-Length: ' . $byte_range); 
    header('Expires: ' . date('D, d M Y H:i:s', time() + 60 * 60 * 24 * $expiry) . ' GMT'); 

    $buffer = ''; 
    $bytes_remaining = $byte_range; 

    $handle = fopen($filename, 'r'); 
    if(!$handle) 
    { 
     throw new Exception("Could not get handle for file: " . $filename); 
    } 
    if (fseek($handle, $byte_offset, SEEK_SET) == -1) 
    { 
     throw new Exception("Could not seek to byte offset %d", $byte_offset); 
    } 

    while ($bytes_remaining > 0) 
    { 
     $chunksize_requested = min($buffer_size, $bytes_remaining); 
     $buffer = fread($handle, $chunksize_requested); 
     $chunksize_real = strlen($buffer); 
     if ($chunksize_real == 0) 
     { 
      break; 
     } 
     $bytes_remaining -= $chunksize_real; 
     echo $buffer; 
     flush(); 
    } 
} 
1

Tôi chắc chắn là một vấn đề hấp dẫn. Và thực sự khó xác định nguyên nhân gốc rễ ở đây. Nhưng nếu tôi ở trong trường hợp của bạn, tôi sẽ kiểm tra hai thứ.

  1. Đầu tiên tôi sẽ đảm bảo rằng giữ-sống được thiết lập để tắt KeepAlive Off trên httpd.conf của bạn

  2. Sau đó thử nghiệm nó với cấu hình này.

  3. Sau đó tôi sẽ vô hiệu hóa tất cả các bộ nhớ đệm trình duyệt:

    header ('Cache-Control: no-cache, không có cửa hàng, phải xác nhận lại'); tiêu đề ('Pragma: no-cache'); tiêu đề ('Hết hạn: 0');

  4. Kiểm tra cuối cùng sau đó.

Vấn đề có vẻ như là giữ lại hoặc lưu trong bộ nhớ cache của trình duyệt hoặc thậm chí cả hai, nhưng tôi không thể hiểu tại sao nó chỉ xuất hiện trong chrome. Như một phương sách cuối cùng, hãy đảm bảo rằng bạn không sử dụng bất kỳ tiện ích mở rộng nào có thể tạo ra các sự cố như Adblock.

Hy vọng tôi sẽ giúp bạn thực hiện những thông tin này :)

0

Tôi gặp vấn đề tương tự khi cố gắng phát tệp âm thanh. Tôi đã thực sự giải quyết vấn đề của mình bằng sự trùng hợp ngẫu nhiên.

Tôi đã tạo một tập lệnh có thể giảm tốc độ bit của các tệp xuống 128kbps bằng FFMPEG (hoạt động cho video quá xa như tôi biết). Sau đó khi kiểm tra trong chrome tôi bắt đầu nhận thấy rằng tất cả các yêu cầu của tôi, nơi hoàn thành sau một vài giây, như trái ngược với ở không đầy đủ vô thời hạn như trước. Không chắc chắn nếu điều này khả thi cho bạn không, nhưng nén các tập tin giải quyết vấn đề này cũng như tăng tốc độ streaming vì vậy tôi khuyên bạn nên điều này.

Các vấn đề liên quan