ruby-on-rails ipad ruby-on-rails-4 video-streaming x-sendfile

ruby on rails - Rails+X-Sendfile que sirve un gran video para Ipad



ruby-on-rails ruby-on-rails-4 (1)

Esto podría no estar relacionado por completo ya que estoy usando nginx para el servidor, pero si solo no funciona para iOS, eche un vistazo a esta publicación de blog . Podría haber una solución similar para Apache.

En cierto sentido, tuve que agregar un encabezado proxy que redirige internamente a una ruta de carpeta. Aunque parezca estúpido, Apple tiene algún tipo de problema de privacidad que lo hace necesario para la reproducción con archivos de audio y video. Una vez más, no estoy seguro de si esta es la solución para usted, pero para nginx esto hizo maravillas y curó mi dolor de cabeza de un mes de duración.

Tengo una aplicación que sirve archivos de video grandes (algunos cientos de MB) y está funcionando perfectamente en los navegadores de escritorio, usando Rails + X-Sendfile en Apache. Un requisito importante es que estos videos deben ser privados y visibles solo para los usuarios registrados, por eso estoy usando Rails para servirlos.

Todo funciona perfectamente con otros dispositivos. Sirvo los videos de esta manera:

response.headers["X-Sendfile"]= filename send_file filename, :disposition => :inline, :stream => true, :x_sendfile => true

Pero las solicitudes de Ipad necesitan el encabezado del rango de bytes. Una solución (que no funciona a la perfección) es algo como esto:

size = File.size(filename) bytes = Rack::Utils.byte_ranges(request.headers, size)[0] offset = bytes.begin length = bytes.end - bytes.begin response.header["Accept-Ranges"]= "bytes" response.header["Content-Range"] = "bytes #{bytes.begin}-#{bytes.end}/#{size}" send_data IO.binread(filename,length, offset), :type => "video/mp4", :stream => true, :disposition => ''inline'', :file_name => filename

Con esta solución tengo problemas con videos de más de 50mb, y, más importante, le estoy dando a los rieles una responsabilidad que no debería tener. Debería ser apache manejar la carga pesada de la transmisión, a través del módulo x-sendfile. Pero no sé cómo. el método send_data no tiene el parámetro x-sendfile, y las soluciones que involucran el método send_file no funcionan.

Encontré estas 2 preguntas similares a las mías pero no están funcionando: los carriles de la secuencia de archivos multimedia aceptan la solicitud de rango de bytes a través de los métodos send_data o send_file . ¿Cuál es la manera correcta de enviar archivos mp4 a través de los rieles a un Ipad?

¿Alguna pista sobre lo que está pasando? Estoy luchando con esto desde hace semanas y necesito hacerlo funcionar. Otras soluciones factibles son bienvenidas.