audio.duration возвращает Infinity на Safari, когда mp3 поддерживается с PHP

Итак, у меня есть php-скрипт, который отправляет мой mp3-файл в звуковой тег html5. Проблема в том, что в Safari тег audio.duration не работает и возвращает бесконечность. Если я устанавливаю src аудио непосредственно в файл, все работает нормально. Но я не хочу, чтобы мои пользователи видели путь к файлу.

В любом случае, вот как я отправляю свои заголовки из PHP.

Я уже пробовал иметь диапазоны контента. Это не помогло.

if (file_exists($filename)) { $fp = fopen($filename, 'r'); $etag = md5(serialize(fstat($fp))); fclose($fp); header("Content-Transfer-Encoding: binary"); header("Content-Type: audio/mpeg"); header('Content-Length: ' . (string)(filesize($filename))); header('Content-Disposition: inline; filename="' . $filename . '"'); header('X-Pad: avoid browser bug'); header('Cache-Control: no-cache'); header('Etag: ' . $etag); //GetContentRange($filelength); readfile($filename); exit; } else { header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); echo "no file"; } 

У меня была такая же проблема, и я добавил пару заголовков. Кажется, для меня работает –

  header("Pragma: public"); header("Expires: 0"); header("Content-Type: audio/mpeg"); header('Content-Length: ' . $fsize); header('Content-Disposition: inline; filename="' . $track2play . '"'); header( 'Content-Range: bytes 0-'.$shortlen.'/'.$fsize); header( 'Accept-Ranges: bytes'); header('X-Pad: avoid browser bug'); header('Cache-Control: no-cache'); header('Etag: ' . $etag); 

$ fsize – это размер файла и $ shortlen = $ filesize-1 … проверено на Safari 5.1.4 и на новом iPad …

Ваш сервер должен включить запросы диапазона. Это легко проверить, если вы ответили, что ответ вашего сервера включает Accept-Ranges в его заголовке. Большинство браузеров HTML5 позволяют искать новые позиции файлов во время загрузки, поэтому сервер должен разрешить запрашивать новый диапазон.

Невозможность принимать байты запросов диапазона вызовет проблемы в некоторых браузерах HTML5. Часто продолжительность не может быть прочитана из файла, так как некоторые форматы требуют, чтобы начало и конец файла были прочитаны, чтобы знать его продолжительность. Chrome, как правило, является браузером, который имеет большинство проблем, если запрос диапазона не включен на сервере, но у всех браузеров будет какая-то проблема, даже если это только то, что вам нужно дождаться загрузки всех носителей, прежде чем прыгать близко к концу ,

См. Это сообщение для примера PHP, как использовать носители с включенными запросами диапазона.

Кроме того, я заметил, что вы используете No-Cache ..

Использование ответа сервера для отключения локального кеша носителя может вызвать проблемы с некоторыми браузерами HTML5. Это может привести к неизвестности продолжительности носителя.

  • Сегодня я потратил большую часть своего времени на изучение этой проблемы и, наконец, вышел с решением. Причина, по которой сафари возвращает продолжительность, поскольку бесконечность довольно интересная: похоже, что Safari дважды запрашивает сервер для воспроизведения файлов. Сначала он отправляет запрос диапазона на сервер с заголовком диапазона следующим образом: (bytes: 0-1).
  • Если сервер не возвращает ответ в виде частичного содержимого, и если он возвращает весь поток, то браузер Safari не будет устанавливать тег audio.duration и который приведет к воспроизведению файла только один раз, и его невозможно воспроизвести снова.
  • Я быстро исправил это, на стороне сервера просто проверьте заголовок, и если он содержит rangeHeader, верните его.

    String rangeHeader = request.getHeader("Range"); if(rangeHeader != null) { //just return it }