Итак, у меня есть 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. Это может привести к неизвестности продолжительности носителя.
Я быстро исправил это, на стороне сервера просто проверьте заголовок, и если он содержит rangeHeader, верните его.
String rangeHeader = request.getHeader("Range"); if(rangeHeader != null) { //just return it }