with variable not from found array app php ios iphone video-streaming laravel-5

php - variable - return view laravel



Laravel 5 HTTP Response, archivos M4V y iOS MPMoviePlayerViewController (1)

Parece que tengo la respuesta a mi propia pregunta. La causa subyacente fue que Laravel 5 no admite de forma nativa las solicitudes de rango de bytes HTTP al servir archivos.

Esta publicación ubicada aquí me llevó por el camino correcto:

MPMoviePlayerPlaybackDidFinishNotification se llama inmediatamente

Luego encontré dos publicaciones sobre cómo hacer este Laravel 5:

http://laravel.io/forum/09-23-2014-how-to-support-http-byte-serving-in-file-streams

https://gist.github.com/m4tthumphrey/b0369c7bd5e2c795f6d5

El único inconveniente es que no puedo usar Storage Facade para acceder directamente a los archivos como transmisiones. Por lo tanto, esta solución solo se puede usar para archivos ubicados en el sistema de archivos local.

public static function getfile($filename) { $size = Storage::disk(''local'')->size(''files/''.$filename); $file = Storage::disk(''local'')->get(''files/''.$filename); $stream = fopen($storage_home_dir.''files/''.$filename, "r"); $type = ''video/mp4''; $start = 0; $length = $size; $status = 200; $headers = [''Content-Type'' => $type, ''Content-Length'' => $size, ''Accept-Ranges'' => ''bytes'']; if (false !== $range = Request::server(''HTTP_RANGE'', false)) { list($param, $range) = explode(''='', $range); if (strtolower(trim($param)) !== ''bytes'') { header(''HTTP/1.1 400 Invalid Request''); exit; } list($from, $to) = explode(''-'', $range); if ($from === '''') { $end = $size - 1; $start = $end - intval($from); } elseif ($to === '''') { $start = intval($from); $end = $size - 1; } else { $start = intval($from); $end = intval($to); } $length = $end - $start + 1; $status = 206; $headers[''Content-Range''] = sprintf(''bytes %d-%d/%d'', $start, $end, $size); } return Response::stream(function() use ($stream, $start, $length) { fseek($stream, $start, SEEK_SET); echo fread($stream, $length); fclose($stream); }, $status, $headers); }

Tengo una situación que me tiene perplejo, así que estoy buscando cualquier ayuda que pueda obtener.

Tengo una aplicación de iOS que usa MPMoviePlayerViewController para reproducir archivos de video M4V administrados por un sitio de Laravel 5.

Los archivos de video funcionan perfectamente bien (en iOS) si se descargan directamente de la carpeta pública Laravel 5. Sin embargo, normalmente estoy almacenando y sirviendo los archivos de video de Storage Facade de Laravel 5, ya que eventualmente voy a usar S3 y el transcodificador elástico.

Esto funciona en Firefox con el complemento de navegador QuickTime, VLC y otros clientes de transmisión de video, pero no con nuestra aplicación de iOS.

Hasta donde puedo decir, MPMoviePlayerViewController es exigente con la forma en que se está formateando la Respuesta HTTP. He intentado con StreamedResponse, pero eso no parece ayudar.

Así que, por ejemplo, la siguiente URL que extrae el archivo directamente de la carpeta / public funciona bien desde iOS:

http://172.16.160.1/video_ae9a7da0efa211e4b115f73708c37d67.m4v

Pero si uso Laravel 5 para extraer el archivo de Storage con esta URL, iOS no lo reproducirá.

http://172.16.160.1/api/getfile/f444b190ef5411e4b7068d1890d109e8/video_ae9a7da0efa211e4b115f73708c37d67.m4v

Tenga en cuenta que iOS no proporciona ningún error significativo para ayudar a depurar esto, pero estoy seguro de que la Laravel 5 está haciendo la respuesta HTTP.

Aquí está mi ruta:

Route::get(''myapi/getfile/{filename?}'', ''APIController@getfile'')->where(''filename'', ''(.*)'');

Aquí está mi controlador:

public function getfile($filename) { return $api = API::getfile($filename); }

Aquí está mi Modelo:

public static function getfile($filename) { $file = Storage::disk(''local'')->get(''Files/''.$filename); return (new Response($file, 200))->header(''Content-Type'', ''video/mp4''); }

Si omití cualquier información de soporte, házmelo saber y lo publicaré. Mi siguiente paso puede ser configurar el banco de pruebas de Wireshark y ver cómo se ve el apretón de manos.

Gracias de antemano por la ayuda. :-)