Хорошо, я пытаюсь играть код аудио HTML iPad, но не работаю.
Я создал один Сценарий PHP для отправки к запросу MP3 к аудио коду HTML5
mp3_file_player.php?n=mp3file.mp3
Плеер здесь: http://www.avault.com/news/podcast-news/john-romero-podcast-episode-80/
Вы будете видеть, что работы над каждым HTML5 поддерживали браузер даже на моем iPod Touch. Но не работает над iPad/iPhone, даже над Safari на MAC OSX (я примерил Safari/Windows, хорошо работал),
Это - мой код PHP:
header("X-Powered-By: ");
header("Accept-Ranges: bytes");
header("Content-Length: ". (string)(filesize($episode_filename)) ."");
header("Content-type: audio/mpeg");
readfile($episode_filename);
exit();
Все хорошо работает, MP3 имеет те же заголовки как чтение mp3 непосредственно.
HTTP-заголовки от доступа файла прямого доступа:
(Status-Line) HTTP/1.1 200 OK
Date Mon, 31 May 2010 20:27:31 GMT
Server Apache/2.2.9
Last-Modified Wed, 26 May 2010 13:39:19 GMT
Etag "dac0039-41d91f8-4877f669cefc0"
Accept-Ranges bytes
Content-Length 50656162
Content-Range bytes 18390614-69046775/69046776
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type audio/mpeg
HTTP-заголовок из моего Сценария PHP:
(Status-Line) HTTP/1.1 200 OK
Date Mon, 31 May 2010 20:27:08 GMT
Server Apache/2.2.9
Accept-Ranges bytes
Content-Length 69046776
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type audio/mpeg
Единственная вещь, отличающаяся, это - Довольный Диапазон, я даже пытался добавить его, но если я буду использовать его, то плеер не будет работать над моим IPod touch. Таким образом, я удалил.
Большое спасибо.
Попробуйте удалить header("Accept-Ranges: bytes");
так как вы не отправляете часть файла.
Удалите header("X-Powered-By: ");
, так как Apache все равно его обслуживает
$etag = md5(serialize(fstat($fp)));
fclose($fp);
header('Etag: '.$etag);
^^ Добавьте электронный тег
И попробуйте!
Content-Range
действителен только при статусе 206.
Похоже, что ваш код вообще не поддерживает частичные запросы (вам пришлось бы разбирать заголовок Range
и соответственно сшивать тело ответа, а Content-Length
= filesize($episode_filename)
будет недействительным почти в каждом случае).
Если вы не собираетесь реализовывать HTTP-сервер внутри HTTP-сервера, пусть Apache обслуживает MP3.
Если вам нужно, чтобы контроль доступа был реализован в PHP, проверьте расширение X-Sendfile
или создайте симлинки с неугадываемыми именами файлов и перенаправляйте клиентов туда.
Если вы действительно хотите сделать частичную загрузку HTTP сложным способом, прочитайте RFC 2616 или найдите библиотеку, которая сделает все это за вас. Не отправляйте вслепую все HTTP-заголовки, которые найдете.