2010-05-31 7 views
7

Ok, próbuję odtworzyć kod HTML HTML na iPadzie, ale nie działa.Dźwięk HTML5 ze skryptem PHP nie działa na iPadzie/Iphone

stworzyłem jeden skrypt PHP do wysyłania na żądanie MP3 do kodu

mp3_file_player.php HTML5 audio N = mp3file.mp3

Odtwarzacz jest tutaj: http://www.avault.com/news/podcast-news/john-romero-podcast-episode-80/

Zobaczysz, że działa na każdej przeglądarce obsługującej HTML5, nawet na moim iPodzie Touch. Ale nie działa na iPad/iPhone, nawet w Safari na Mac OSX (próbowałem na Safari/Windows, pracował w porządku)

To jest mój kod 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(); 

Wszystko działa poprawnie, MP3 ma takie same nagłówki jak bezpośrednie czytanie mp3.

nagłówków HTTP z bezpośrednim dostępem do pliku: nagłówek

(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 z mojego skryptu 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 

Jedyne co różni to jest Content-klasy, ja nawet nie próbował go dodać , ale jeśli go użyję, odtwarzacz nie będzie działał na moim iPodzie Touch. Więc usunąłem.

Dziękuję bardzo.

+0

dobrze współpracuje z najnowszej kompilacji Webkit na Mac OS X (choć mówi "Live Broadcast" zamiast). – zneak

+0

Transmisja na żywo to dla mnie naprawdę bałagan na safari. – thouliha

Odpowiedz

2

Spróbuj usunąć header("Accept-Ranges: bytes");, ponieważ nie wysyłasz fragmentu pliku. Zdjąć header("X-Powered-By: "); jak Apache służy które zresztą

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

^^ Dodaj elektronicznego tag

i nadać mu iść!

+0

Dzięki, zmieniłem wszystko, spróbuję i zobaczę rezultat. Ale twój $ etag brakuje $ fp, znalazłem go online: $ fp = fopen ($ _ SERVER ["SCRIPT_FILENAME"], "r"); Dobrze? Dzięki. Właśnie zaimplementowałem, zapytam przyjaciela z iPadem, aby go przetestować. – saulob

+0

RobertPitt, to było to. Usunąłem Accept-Ranges i Add the Etag, nie usunąłem X-Powered. Ale zadziałało. Teraz wszystko jest gładkie. Dzięki. – saulob

+2

Aplikacja ETag nie jest potrzebna, szczególnie gdy nie stosuje się sprawdzania poprawności pamięci podręcznej. – Kornel

3

Content-Range jest ważna tylko ze statusem 206.

Twój kod nie wydają się potwierdzać wnioski cząstkowe w ogóle (trzeba by zanalizować Range nagłówek i zszyć razem reakcja na ciało odpowiednio i Content-Length = filesize($episode_filename) byłoby nieważne w prawie każdym przypadku).

Jeśli nie zamierzasz zaimplementować serwera HTTP w serwerze HTTP, pozwól serwerowi Apache na odtwarzanie plików MP3.

Jeśli potrzebujesz kontroli dostępu zaimplementowanej w PHP, sprawdź rozszerzenie lub utwórz dowiązania symboliczne z nieczytelnymi nazwami plików i przekierowuj tam klientów.

Jeśli naprawdę chcesz wykonać częściowe pobieranie HTTP w trudny sposób, przeczytaj dokument RFC 2616 lub znajdź bibliotekę, która zrobi to wszystko za Ciebie. Nie przesyłaj ślepo nagłówków HTTP, które znajdziesz.

+0

Nie mam dostępu do Apache, dziękuję ... – saulob

3

Dostarczałem mp3 do odtwarzacza muzycznego. Miałem podobne nagłówki. Niektóre pliki mp3 są odtwarzane na iPadzie. inni nie.

Znalazłem w tym artykule naprawione moje problemy. http://mobiforge.com/developing/story/content-delivery-mobile-devices Zasadniczo Apple iPhone wykorzystuje zakresy bajtów HTTP do żądania plików audio i wideo.

moje nagłówki są:

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); 
+0

Nice! To działało dla mnie, dziękuję bardzo! – timing