gpt4 book ai didi

php - Laravel 5 HTTP 响应、M4V 文件和 iOS MPMoviePlayerViewController

转载 作者:可可西里 更新时间:2023-11-01 03:43:17 25 4
gpt4 key购买 nike

我遇到了一个让我难过的情况,所以我正在寻求任何我能得到的帮助。

我有一个 iOS 应用程序,它使用 MPMoviePlayerViewController 播放由 Laravel 5 站点管理的 M4V 视频文件。

如果视频文件直接从 Laravel 5/public 文件夹下载,则可以完美播放(在 iOS 中)。但是,我通常从 Laravel 5 的 Storage Facade 存储和提供视频文件,因为我最终将使用 S3 和弹性转码器。

这适用于带有 QuickTime 浏览器插件、VLC 和其他流媒体视频客户端的 FireFox,但不适用于我们的 iOS 应用程序。

据我所知,MPMoviePlayerViewController 对 HTTP 响应的格式设置很挑剔。我试过 StreamedResponse,但这似乎没有帮助。

例如,以下直接从/public 文件夹中提取文件的 URL 在 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', '(.*)');

这是我的 Controller :

    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 测试台并查看握手的样子。

在此先感谢您的帮助。 :-)

最佳答案

看来我已经找到了我自己问题的答案。根本原因是 Laravel 5 在提供文件时不原生支持 HTTP 字节范围请求。

这篇位于此处的帖子让我走上了正确的轨道:

MPMoviePlayerPlaybackDidFinishNotification is called immediately

然后我找到了两篇关于如何使用 Laravel 5 的帖子:

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

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

唯一的缺点是我不能使用 Storage Facade 以流的形式直接访问文件。所以这个解决方案只能用于位于本地文件系统上的文件。

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);
}

关于php - Laravel 5 HTTP 响应、M4V 文件和 iOS MPMoviePlayerViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29991254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com