2017-12-29 49 views
0

zurückgeben Ich wollte einen Endpunkt haben, der ein mp4-Video zurückgeben würde.MP4-Video mit Slim 3

Der vollständige Endpunkt war

$app->get('{userid}/clips/{clipid}/video', '\GameDVRController:clipGetVideo'); 

Und die Funktion für diesen Endpunkt ist

public function clipGetVideo($request, $response, $args) { 
    $clipid = $args['clipid']; 
    $clip = GameClip::where('id', $clipid)->first(); 

    // (Note: clip->File is full path to file on disk) 
    $file = file_get_contents($clip->File); 
    $response->getBody()->write($file); 

    $response = $response->withHeader('Content-type', 'video/mp4'); 
    return $response; 
} 

Wenn ich an den Endpunkt gehen, Chrom erkennt an, dass es ein Video ist, aber ich glaube nicht, dass es Rückgabe des eigentlichen Videos Der Spieler sieht nichts und lädt in Sekundenbruchteilen.

+0

Wie groß ist die Datei? – jmattheis

Antwort

0

Dies ist wahrscheinlich und Problem mit großen Dateien, für mich scheint alles mit Dateien zu arbeiten, die ~ 20mb groß sind.

Ich kann das Problem beheben, indem Sie die Datei als Stream wie diese Einstellung:

public function clipGetVideo($request, $response, $args) { 
    set_time_limit(0); 

    $clipid = $args['clipid']; 
    $clip = GameClip::where('id', $clipid)->first(); 

    $response = $response->withHeader('Content-type', 'video/mp4'); 
    return $response->withBody(new Stream(fopen($clip->File, "rb"))) 
} 

oder durch einen nicht Schlanke Ansatz mit benutzerdefinierter Pufferung mit:

public function clipGetVideo($request, $response, $args) { 
    set_time_limit(0); 

    $clipid = $args['clipid']; 
    $clip = GameClip::where('id', $clipid)->first(); 

    header('Content-Type: video/mp4'); 
    header('Content-Length: ' . filesize($clip->File)); 

    $handle = fopen($clip->File, "rb"); 
    while (!feof($handle)){ 
     echo fread($handle, 8192); 
     ob_flush(); 
     flush(); 
    } 
    fclose($handle); 
    exit(0); 
}