Streaming von Videos mit ASP.NET Core 3

8

Ich erstelle derzeit eine API in ASP.NET Core 3 als mein erstes Projekt mit .NET Core.

Ich versuche gerade, ein Video an mein React.js-Frontend zu senden, um es im Browser anzusehen. Das Hochladen von Dateien und Videos funktioniert problemlos und die unten gezeigte Methode sendet bereits eine Datei an den Client. Wenn das Video jedoch länger als einige Sekunden ist, ist der Videoplayer sehr langsam und das Überspringen dauert ebenfalls lange ein paar Sekunden des Videos. Ich denke, das liegt daran, dass die Datei zuerst vollständig heruntergeladen und dann abgespielt wird.

[Route("getFileById")]
public FileResult getFileById(int fileId)
{

    var context = new DbContext();

    var file = context.File.Find(fileId);

    if (file == null)
    {
        Console.WriteLine("file " + fileId + " not found");
        return null;
    }

    var content  = new FileStream(file.Name, FileMode.Open, FileAccess.Read, FileShare.Read);
    var response = File(content, "application/octet-stream");
    return response;
}

Ich denke, der Weg, um mein Problem zu lösen, besteht darin, die Datei zu streamen und nicht als Ganzes zu senden. Ich habe bereits gegoogelt, wie Videos mit ASP.NET Core 3 gestreamt werden, aber ich finde nur Websites, die dies für ASP.NET Core 2 erklären (z. B. http://anthonygiretti.com/2018/01/16/streaming-video-asynchronously) -in-asp-net-core-2-with-web-api / )

Ich habe bereits versucht, den Code auf diesen Websites zu verwenden, aber die Art und Weise, wie sie es getan haben, ist nicht mit ASP.NET Core 3 kompatibel.

Wie kann ich Dateien in ASP.NET Core 3 streamen?

Lukas Köhler
quelle
1
Wenn das Übertragen und Speichern dieser Videodateien in Ihrer App nicht unbedingt erforderlich ist, können Sie eine Cloud-Lösung wie Azure Blob Storage oder Azure Media Services verwenden (wenn Sie bestimmte Medien- / Streaming-Funktionen benötigen). Mit Azure Blob können Sie Dateien schnell und ohne Overhead für Ihre Anwendung hochladen / herunterladen.
Guilherme Meinlschmiedt Abdo

Antworten:

6

Wenn Sie das Video im Browser streamen möchten, sollte Ihr Server HTTP-Bereichsanforderungen unterstützen . In diesem Fall kann der Server nur einen kleinen Teil eines vom Client angeforderten Inhalts senden. Wenn Sie Videos im Browser streamen möchten, können Sie ein videoHTML-Tag verwenden, das mithilfe von Bereichskopfzeilen einen Inhalt anfordert. Daher können Sie auch einige Zeit überspringen und den Film sofort von dieser Position aus abspielen, bevor er vollständig heruntergeladen wird.

ASP.NET Core 3 unterstützt bereits HTTP-Bereichsanforderungen. Es ist in einer PhysicalFileMethode mit dem Attribut enableRangeProcessing implementiert . Wie die Dokumentation sagt:

Gibt die von PhysicalPath (Status200OK) angegebene Datei, den angegebenen ContentType als Content-Type und den angegebenen FileDownloadName als vorgeschlagenen Dateinamen zurück. Dies unterstützt Bereichsanforderungen (Status206PartialContent oder Status416RangeNotSatisfiable, wenn der Bereich nicht erfüllt werden kann).

[Route("getFileById")]
public FileResult getFileById(int fileId)
{
    ...
    return PhysicalFile($"C:/movies/{file.Name}", "application/octet-stream", enableRangeProcessing: true);
}

Beachten Sie, dass der Pfad absolut (nicht relativ) sein muss.

Mayo
quelle
Ich werde das versuchen, vielen Dank für Ihre Antwort!
Lukas Köhler