HTML5 аудио с PHP скриптом не работает на iPad / Iphone - PullRequest
8 голосов
/ 01 июня 2010

Хорошо, я пытаюсь воспроизвести аудиокод HTML на iPad, но не работает.

Я создал один PHP-скрипт для отправки в MP3-запрос на аудиокод HTML5

mp3_file_player.php? П = 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

Единственное отличие - это Content-Range , я даже пытался добавить его, но если я его использую, плеер не будет работать на моем Ipod Touch. Итак, я удалил.

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 17 ноября 2011

я подавал mp3 в музыкальный проигрыватель .. У меня были похожие заголовки. Некоторые mp3 играли на Ipad. другие не сделали.

Я обнаружил, что эта статья исправила мои проблемы. http://mobiforge.com/developing/story/content-delivery-mobile-devices По сути, Apple iPhone использует байтовые диапазоны HTTP для запроса аудио и видео файлов.

мои заголовки:

header("X-Powered-By: ");
header('Content-Length: '. (string)filesize($path)); // provide file size
header('Content-type: audio/mpeg');

if(isset($_SERVER['HTTP_RANGE']))  { // any device that supports byte-ranges
 rangeDownload($path); // function from article mentioned above
}

$fp = fopen($_SERVER["SCRIPT_FILENAME"], "r");
$etag = md5(serialize(fstat($fp))); 
fclose($fp); 
header('Etag: '.$etag); 
readfile($path);
3 голосов
/ 01 июня 2010

Content-Range действует только со статусом 206.

Ваш код, кажется, вообще не поддерживает частичные запросы (вам придется анализировать заголовок Range и сшивать тело ответа соответственно, и Content-Length = filesize($episode_filename) будет недействительным почти в каждом случае)

Если вы не собираетесь внедрять HTTP-сервер на HTTP-сервере, пусть Apache обслуживает MP3.

Если вам нужно реализовать контроль доступа в PHP, проверьте расширение X-Sendfile или создайте символические ссылки с неузнаваемыми именами файлов и перенаправьте туда клиентов.

Если вы действительно хотите выполнить частичную загрузку по протоколу HTTP, прочитайте RFC 2616 или найдите библиотеку, которая сделает все за вас. Не отправляйте вслепую любые найденные HTTP-заголовки.

2 голосов
/ 01 июня 2010

Попробуйте удалить header("Accept-Ranges: bytes");, поскольку вы не отправляете часть файла. Удалите header("X-Powered-By: ");, так как Apache выполняет эту функцию в любом случае

$etag = md5(serialize(fstat($fp))); 
fclose($fp); 
header('Etag: '.$etag); 

^^ Добавить электронный тег

И попробуй!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...