2010-05-31 12 views
7

Ok, sto provando a riprodurre un codice audio HTML su iPad ma non funziona.L'audio HTML5 con script PHP non funziona su iPad/Iphone

ho creato uno script PHP per inviare alla richiesta MP3 al codice HTML5 audio

mp3_file_player.php n = mp3file.mp3

il giocatore è qui:? http://www.avault.com/news/podcast-news/john-romero-podcast-episode-80/

Vedrai che funziona su tutti i browser HTML5 supportati anche sul mio iPod Touch. Ma non funziona su iPad/iPhone, anche su Safari su Mac OSX (ho provato su Safari/Windows, ha funzionato bene)

Questo è il mio codice 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(); 

Tutto funziona bene, l'MP3 ha le stesse intestazioni come leggere direttamente l'mp3.

intestazioni HTTP da accesso diretto ai file: Intestazione

(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 dal mio script 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 

L'unica cosa diversa è il Content-Range, ho anche provato ad aggiungere che , ma se lo uso il lettore non funzionerà sul mio Ipod Touch. Così ho rimosso.

Grazie mille.

+0

Opere bene dalla ultima build Webkit su Mac OS X (se si dice "Live Broadcast", invece). – zneak

+0

La trasmissione dal vivo è davvero un casino per me. – thouliha

risposta

2

Provare a rimuovere header("Accept-Ranges: bytes"); poiché non si invia una parte del file. Rimuovere il header("X-Powered-By: "); come Apache serve che comunque

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

^^ Aggiungi un tag elettronico

e dargli un andare!

+0

Grazie, ho cambiato tutto, provarlo e vedere il risultato. Ma il tuo $ etag manca $ fp, l'ho trovato online: $ fp = fopen ($ _ SERVER ["SCRIPT_FILENAME"], "r"); Giusto? Grazie. Ho appena implementato, chiedendo ad un amico con iPad di testarlo. – saulob

+0

RobertPitt, era così. Ho rimosso gli Accept-Ranges e aggiungo l'Etag, non ho rimosso X-Powered. Ma ha funzionato. Tutto è liscio ora. Grazie. – saulob

+2

ETag non è necessario, specialmente quando non si implementa la convalida della cache. – Kornel

3

Content-Range è valido solo con lo status di 206.

Il codice non sembra per supportare le richieste parziali a tutti (che avrebbe dovuto analizzare Range intestazione e cucire insieme risposta del corpo di conseguenza, e Content-Length = filesize($episode_filename) sarebbe invalido in quasi tutti i casi).

Se non si intende implementare il server HTTP all'interno del server HTTP, lasciare che Apache fornisca l'MP3.

Se è necessario implementare il controllo degli accessi in PHP, controllare l'estensione o creare collegamenti simbolici con nomi di file non accessibili e reindirizzare i client in tale posizione.

Se si desidera veramente eseguire download parziali HTTP nel modo più rigido, leggere RFC 2616 o trovare la libreria che farà tutto ciò che fa per voi. Non inviare ciecamente le intestazioni HTTP che trovi.

+0

Non ho accesso ad Apache, grazie ... – saulob

3

stavo servendo gli mp3 a un lettore musicale ... Avevo intestazioni simili. Alcuni mp3 riprodotti su iPad. altri no.

ho trovato questo articolo risolto i miei problemi. http://mobiforge.com/developing/story/content-delivery-mobile-devices Fondamentalmente, l'iPhone di Apple utilizza gli intervalli di byte HTTP per richiedere file audio e video.

miei intestazioni sono:

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

Bello! Questo ha funzionato per me, grazie mille! – timing