Transmisión de videos con ASP.NET Core 3

8

Actualmente estoy construyendo una API en ASP.NET Core 3 como mi primer proyecto con .NET Core.

Actualmente estoy tratando de enviar un video a mi interfaz de React.js para verlo en el navegador. La carga de archivos y videos funciona sin problemas y el método que ve a continuación también envía un archivo al cliente, pero si el video dura más de unos segundos, el reproductor de video es realmente lento y también toma mucho tiempo omitirlo. unos segundos del video. Creo que es porque el archivo primero se descarga completamente y luego se reproduce.

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

Creo que la forma de resolver mi problema es transmitir el archivo y no enviarlo como un todo. Ya busqué en Google cómo transmitir videos con ASP.NET Core 3, pero solo encuentro sitios web que lo explican para ASP.NET Core 2 (por ejemplo, http://anthonygiretti.com/2018/01/16/streaming-video-asynchronnous -in-asp-net-core-2-with-web-api / )

Ya intenté usar el código en estos sitios web, pero la forma en que lo hicieron no es compatible con ASP.NET Core 3.

¿Cómo puedo transmitir archivos en ASP.NET Core 3?

Lukas Köhler
fuente
1
Si no es realmente necesario transferir y almacenar esos archivos de video en su aplicación, puede usar alguna solución en la nube como Azure Blob Storage o Azure Media Services (si necesita algunas capacidades específicas de medios / transmisión). Con Azure Blob, puede cargar / descargar archivos rápidamente y sin sobrecargar su aplicación.
Guilherme Meinlschmiedt Abdo

Respuestas:

6

Si desea transmitir el video en el navegador, su servidor debe admitir solicitudes de rango HTTP . En tal caso, el servidor puede enviar solo una pequeña porción de un contenido solicitado por el cliente. Como desea transmitir video en el navegador, puede usar la videoetiqueta html que solicita un contenido usando encabezados de rango. Por lo tanto, también puede omitir un tiempo e inmediatamente reproducir la película desde esa posición, antes de que se descargue completamente.

ASP.NET Core 3 ya tiene soporte para solicitudes de rango HTTP, se implementa en un PhysicalFilemétodo que tiene el atributo enableRangeProcessing . Como dice la documentación:

Devuelve el archivo especificado por physicalPath (Status200OK), el contentType especificado como Content-Type y el fileDownloadName especificado como el nombre de archivo sugerido. Esto admite solicitudes de rango (Status206PartialContent o Status416RangeNotSatisfiable si el rango no es satisfactorio).

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

Tenga en cuenta que la ruta debe ser absoluta (no relativa).

Mayonesa
fuente
Lo intentaré, ¡muchas gracias por tu respuesta!
Lukas Köhler