2010-05-31 24 views
7

Ok, estoy intentando reproducir un código de audio HTML en el iPad pero no funciona.El audio HTML5 con script PHP no funciona en iPad/Iphone

creé un script PHP para enviar a la solicitud de MP3 para el código de audio HTML5

mp3_file_player.php n = mp3file.mp3

el jugador está aquí:? http://www.avault.com/news/podcast-news/john-romero-podcast-episode-80/

Verás que funciona en todos los navegadores compatibles con HTML5 incluso en mi iPod Touch. Pero no funciona en iPad/iPhone, incluso en Safari en Mac OS X (He intentado en Safari/Windows, trabajó muy bien)

Este es mi código 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(); 

Todo funciona bien, el MP3 tiene los mismos encabezados como leer el mp3 directamente.

encabezados HTTP de acceso directo a archivos: Cabecera

(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 desde mi 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 

Lo único diferente es la Content-Range, que incluso trató de agregarlo , pero si lo uso, el reproductor no funcionará en mi Ipod Touch. Entonces lo eliminé.

Muchas gracias.

+0

Funciona bien desde la última versión de Webkit en Mac OS X (aunque se dice "transmisión en vivo" en su lugar). – zneak

+0

La transmisión en vivo realmente está estropeando las cosas en safari para mí. – thouliha

Respuesta

2

Pruebe eliminar header("Accept-Ranges: bytes"); ya que no está enviando una parte del archivo. Retire la header("X-Powered-By: "); como Apache sirve eso de todos modos

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

^^ Añadir una etiqueta electrónica

y darle una oportunidad!

+0

Gracias, lo cambié todo, voy a probarlo y veo el resultado. Pero a su $ etag le falta $ fp, lo encontré en línea: $ fp = fopen ($ _ SERVER ["SCRIPT_FILENAME"], "r"); ¿Correcto? Gracias. Acabo de implementar, voy a pedirle a un amigo con iPad que lo pruebe. – saulob

+0

RobertPitt, eso fue todo. Eliminé los rangos de aceptación y agregué el Etag, no eliminé el X-Powered. Pero funcionó. Todo esta bien ahora Gracias. – saulob

+2

ETag no es necesario, especialmente cuando no está implementando la validación de caché. – Kornel

3

Content-Range sólo es válida con el estado 206.

Su código no parecen apoyar solicitudes parciales en absoluto (que tendría que analizar Range cabecera y coser juntos cuerpo de la respuesta en consecuencia, y Content-Length = filesize($episode_filename) sería inválido en casi todos los casos).

Si no va a implementar el servidor HTTP dentro del servidor HTTP, deje que Apache le entregue el MP3.

Si necesita tener implementado el control de acceso en PHP, consulte la extensión o cree enlaces simbólicos con nombres de archivos indescifrables y redireccione a los clientes allí.

Si realmente desea hacer descargas parciales HTTP de la manera difícil, lea RFC 2616 o busque la biblioteca que lo hará todo por usted. No envíe ciegamente los encabezados HTTP que encuentre.

+0

No tengo acceso a Apache, gracias ... – saulob

3

estaba sirviendo mp3's a un reproductor de música .. Tenía encabezados similares. Algunos mp3 jugados en ipad. otros no.

encontré este artículo solucionó mis problemas. http://mobiforge.com/developing/story/content-delivery-mobile-devices Básicamente, el iPhone de Apple utiliza rangos de bytes HTTP para solicitar archivos de audio y video.

mis cabeceras son:

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

¡Agradable! Esto funcionó para mí, ¡muchas gracias! – timing

Cuestiones relacionadas