php - quilljs - vue quill-< editor



Laravel 5 HTTP響應,M4V文件和iOS MPMoviePlayerViewController (1)

我有一個情況是我難倒了,所以我正在尋找任何幫助,我可以得到。

我有一個使用MPMoviePlayerViewController播放由Laravel 5站點管理的M4V視頻文件的iOS應用程序。

如果視頻文件直接從Laravel 5 /公共文件夾下載,則視頻文件播放效果會很好(在iOS中)。 不過,我通常會從Laravel 5的Storage Facade存儲和提供視頻文件,因為我最終將使用S3和彈性代碼轉換器。

這在FireFox中使用QuickTime瀏覽器插件,VLC和其他流視頻客戶端,但不是我們的iOS應用程序。

據我可以告訴MPMoviePlayerViewController挑剔如何格式化HTTP響應。 我試過了StreamedResponse,但是這似乎沒有幫助。

因此,例如下面的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不提供任何有意義的錯誤,以幫助調試,但我很積極的如何我的HTTP響應正在由Laravel 5。

這是我的路線:

Route::get('myapi/getfile/{filename?}', '[email protected]')->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測試平台,看看握手的樣子。

先謝謝您的幫助。 :-)


看起來我有我自己的問題的答案。 根本的原因是Laravel 5在提供文件時本身不支持HTTP字節範圍請求。

這篇文章位於這裡讓我走在正確的軌道上:

立即調用MPMoviePlayerPlaybackDidFinishNotification

然後,我發現了兩個職位,這樣做Laravel 5:

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

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

唯一的缺點是我不能使用存儲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);
}




laravel-5