2012-07-11 18 views
13

Actualmente estoy tratando de entregar video MP4 para usar en video HTML5 (usando video-js) a través de un script PHP para controlar el acceso al video. Después de algunas investigaciones pude hacer que esto funcionara, con la ayuda de stackoverflow article found here. Si navego hasta el script PHP, puedo ver el video como si lo estuviera viendo a través de su ruta absoluta (por ejemplo, localhost/myvideo.mp4 en lugar de localhost/myscript.php) en Firefox, Safari e IE. Mi problema es con Google Chrome, que simplemente muestra una pantalla apagada con un pequeño reproductor multimedia en el centro, y no hace nada.Entrega de video MP4 a través de PHP falla en Google Chrome

Intenté utilizar una reescritura rápida como localhost/avideo.mp4 que se dirige al script PHP, pero desafortunadamente esto no cambió nada.

Aquí está mi script:

if (is_file($uri)) { 
    header('Content-Type: video/mp4'); 
    if (isset($_SERVER['HTTP_RANGE'])) { 
     $this->rangeDownload($uri); 
     exit; 
    } else { 
     header("Content-Length: ".filesize($uri)); 
     $this->readfile_chunked($uri); 
     exit; 
    } 
} else { 
    //error 
} 

El método rangeDownload se ha tomado directamente del apéndice A de this link como se sugiere en el artículo antes mencionado stackoverflow.

+0

Se puede publicar toda la información de la cabecera va a enviar? – ethrbunny

+0

Content-type, Accept-Ranges, Content-Range, Content-Length, HTTP/1.1 206 Partial Content. Estos encabezados se usan en el primer caso usando rangeDownload, que se usa para Chrome, aunque readfile_chunked usa menos encabezados (aún no funciona en Chrome). – AaronDS

+0

El único otro que puedo sugerir es Content-Transfer-Encoding: binary. Soy capaz de transferir audio a través de PHP a todos los navegadores que usan este combo. – ethrbunny

Respuesta

2

Tal vez el problema es con la URL (más específicamente, la extensión). Normalmente, usaría el encabezado Content-Disposition, pero entiendo que esto no es deseable al entregar contenido a los móviles.

Trate de usar localhost/myscript.php/myvideo.mp4

Es importante no utilizar la cabecera HTTP "Content-Disposition", ya que algunos teléfonos se niegan a aceptar el contenido cuando se la usa. Al incluir el nombre del archivo en la URL, engañará al teléfono para que piense que es un archivo real y para aceptarlo.

Ahora, cuando envía la URL de descarga al cliente, normalmente no sabe todavía qué dispositivo tiene el cliente, por lo que no sabe qué formatos de archivo admitirá el dispositivo. Por lo tanto, no puede incluir el nombre de archivo en esa URL y, una vez más, necesitará una página de descarga intermedia. Una vez más, vamos a utilizar una URL como:

http://wap.mydomain.tld/get.php/123456abcdef 

Esta vez, cuando el cliente se conecta a descargar el contenido, la secuencia de comandos get.php no creará un archivo temporal, pero punto a otro script que las corrientes del archivo contenido. Suponiendo que el contenido resultante de descarga será "imagen.jpg", la página de descarga intermedia podría señalar el cliente a un URL como:

http://wap.mydomain.tld/download.php/123456abcdef/image.jpg 

De (http://mobiforge.com/developing/story/content-delivery-mobile-devices)

+0

Gracias por su respuesta, aunque como dije en mi pregunta, "Intenté usar una reescritura rápida como localhost/avideo.mp4 que se dirige al script PHP, pero lamentablemente esto no cambió nada". No estoy seguro de qué más sugieres que haga de manera diferente. – AaronDS

+0

La diferencia puede estar en la URL real que obtiene el navegador. Si usa la redirección (30x), el navegador eventualmente obtendrá la URL final, con la extensión .php en lugar de la extensión .mp4; esto puede ser muy importante. ¿Intentó comparar todos los encabezados de solicitud/respuesta (usando Fiddler, por ejemplo?) –

+0

Estoy viendo la información del encabezado ahora en Chrome, pero no estoy seguro de qué hacer con ella. Lo que puedo decir es que hay una clara diferencia. Seguiré este post con una captura de pantalla en un par de horas. – AaronDS

2

entiendo que estés usando video-js, pero recomiendo usar html5media (también consulte github page para obtener más información). Tuve que hacer que los videos estuvieran disponibles en un sitio web para el trabajo e intenté algunas cosas, incluso video-js, pero html5media fue el único que pude obtener trabajando en todos los navegadores.

Una nota al pie que podría ayudar a otros: uno de los requisitos era que alojáramos todos los archivos para que no dependamos de servidores de terceros para servir archivos JavaScript o flash, no recuerdo si con video-js esto fue fácil pero sé que con html5media pudimos descargar flowplayer y tener todo en nuestros servidores.

Y para generar los 3 formatos de vídeo de recomendaciones (MP4, WebM y Theora) Solía ​​Miro Video Converter

+0

Gracias por esta publicación, sin embargo, el problema no está en Video-JS, sino específicamente en Chrome (el el video no se reproduce en Chrome con video-j saca la imagen, y cuando se usa el archivo de video normal, video-js funciona bien). Mis experiencias con video-js han sido buenas; Utilicé el freno de mano para la conversión de archivos y hasta ahora no me he encontrado con ningún problema. Sin embargo, he notado html5media en caso de que necesite encontrar algo nuevo en el futuro. Aclamaciones. – AaronDS

+0

No hay problema @Noobatron. No quiero disuadir a las personas de usar video-js, porque si puedes hacerlo funcionar, ¡oye, genial! Solo pensé que alguien se beneficiaría de escuchar sobre lo que hice en caso de que se encuentren con el mismo tipo de problemas (tal vez simplemente no sabía lo que estaba haciendo con video-js). Tengo Handbrake en casa que uso para convertir DVD a mi teléfono Android y funciona de maravilla.Todavía iría a Miro en el trabajo para esos 3 formatos para la web simplemente porque la interfaz es realmente simple. Espero que tengas tus videos funcionando Chrome! – Dean

Cuestiones relacionadas