PHP служит MP4 – Chrome «Предварительные заголовки показаны / запрос еще не закончен» ошибка

Я хочу проверить подписку пользователей, прежде чем позволить им увидеть видео, поэтому я использую PHP для взаимодействия с Stripe, чтобы проверить подписку пользователя, а не использовать PHP-скрипт для обслуживания MP4 в браузере

Он отлично работает в первый раз, когда видео воспроизводится в Google Chrome (с использованием проигрывателя HTML5) … Но когда я закрываю видео и воспроизвожу его снова, видео больше не воспроизводится … Я НЕ могу перезагрузить текущую страницу , Это похоже на остановку сервера.

Когда я проверяю первый запрос видео (тот, который играл), на закладке Timing я вижу: «ВНИМАНИЕ: запрос еще не закончен!» (снимок экрана ниже)

ВНИМАНИЕ: запрос еще не завершен!

Когда я проверяю второй запрос видео (тот, который не играл), на вкладке «Заголовки» говорится: «[знак осторожности] показаны предварительные заголовки» (снимок экрана ниже)

введите описание изображения здесь

все работало, как ожидалось, в Safari или Firefox

Кто-нибудь знает, что происходит? Единственный способ повторного воспроизведения видео – закрыть текущую вкладку, снова ввести сайт. Перезагрузка не работает!

Я предлагаю вам использовать следующую функцию вместо текущего «потокового скрипта». Если вы передадите $ filename_output, он будет загружать файл в качестве загружаемого файла, и в противном случае он будет транслироваться.

Он должен работать в каждом браузере.

serveFile ( '/, где / мой / 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 MYH: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. Сначала я бы удостоверился, что keep-alive отключен от KeepAlive Off на вашем httpd.conf

  2. Затем проверьте его с помощью этой конфигурации.

  3. Тогда я отключу все кеширование браузера:

    header ('Cache-Control: no-cache, no-store, must-revalidate'); header ('Pragma: no-cache'); header ('Истекает: 0');

  4. Окончательный тест после этого.

Проблема, похоже, связана либо с сохранением или с кешированием браузера, либо с обоими, но я не могу понять, почему он появляется только в хроме. В крайнем случае убедитесь, что вы не используете расширения, которые могут создавать такие проблемы, как Adblock.

Надеюсь, я пойду с этой информацией 🙂

У меня была эта же проблема при попытке потока аудиофайлов. Я в конечном итоге решила свою проблему, просто совпадение.

Я в какой-то момент создал скрипт, который уменьшил бы скорость передачи файлов до 128 кбит / с с использованием FFMPEG (работает также для видео, насколько я знаю). После этого, проверяя в хроме, я начал замечать, что все мои просьбы завершаются через пару секунд, в отличие от того, чтобы оставаться незавершенным до бесконечности. Не уверен, что это для вас нежизнеспособно, но сжатые файлы решили эту проблему, а также увеличили скорость потока, поэтому я настоятельно рекомендую это.