我遇到了一个让我感到困惑的情况,所以我正在寻求任何可以获得的帮助。
我有一个 iOS 应用程序,它使用 MPMoviePlayerViewController 来播放由 Laravel 5 站点管理的 M4V 视频文件。
如果直接从 Laravel 5 /public 文件夹下载视频文件,则可以完美播放(在 iOS 中)。不过,我通常会从 Laravel 5 的存储外观存储和提供视频文件,因为我最终将使用 S3 和弹性转码器。
这可以在 FireFox 中与 QuickTime 浏览器插件、VLC 和其他流视频客户端一起使用,但不适用于我们的 iOS 应用程序。
据我所知,MPMovies PlayerViewController 对 HTTP 响应的格式化方式很挑剔。我尝试过 StreamedResponse,但这似乎没有帮助。
例如,以下 URL 直接从 /public 文件夹中提取文件在 iOS 中工作正常:
http://172.16.160.1/video_ae9a7da0efa211e4b115f73708c37d67.m4v
但是如果我使用 Laravel 5 使用此 URL 从存储中提取文件,iOS 将不会播放它。
http://172.16.160.1/api/getfile/f444b190ef5411e4b7068d1890d109e8/video_ae9a7da0efa211e4b115f73708c37d67.m4v
注意 iOS 没有提供任何有意义的错误来帮助调试,但我确信 Laravel 5 是如何生成我的 HTTP 响应的。
这是我的路线:
Route::get('myapi/getfile/{filename?}', 'APIController@getfile')->where('filename', '(.*)');
这是我的控制器:
public function getfile($filename)
{
return $api = API::getfile($filename);
}
这是我的模型:
public static function getfile($filename) {
$file = Storage::disk('local')->get('Files/'.$filename);
return (new Response($file, 200))->header('Content-Type', 'video/mp4');
}
如果我遗漏了任何支持信息,请告诉我,我会发布它。我的下一步可能是设置 Wireshark 测试平台,看看握手是什么样子的。
先谢谢您的帮助。 :-)