Streaming de vídeos com o ASP.NET Core 3

8

Atualmente, estou criando uma API no ASP.NET Core 3 como meu primeiro projeto com o .NET Core.

No momento, estou tentando enviar um vídeo para o frontend do React.js para assisti-lo no navegador. O upload de arquivos e vídeos funciona sem problemas e o método que você vê abaixo também já envia um arquivo para o cliente, mas se o vídeo demorar mais de alguns segundos, o player de vídeo será muito lento e demorará muito tempo para ser ignorado. alguns segundos do vídeo. Eu acho que é porque o arquivo é primeiro completamente baixado e depois reproduzido.

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

Acho que a maneira de resolver meu problema é transmitir o arquivo e não enviá-lo como um todo. Eu já pesquisei no Google como transmitir vídeos com o ASP.NET Core 3, mas só encontro sites explicando o ASP.NET Core 2 (por exemplo, http://anthonygiretti.com/2018/01/16/streaming-video-asynchronously -in-asp-net-core-2-com-web-api / )

Eu já tentei usar o código nesses sites, mas a maneira como eles o fizeram não é compatível com o ASP.NET Core 3.

Como posso transmitir arquivos no ASP.NET Core 3?

Lukas Köhler
fonte
1
Se não for realmente necessário transferir e armazenar esses arquivos de vídeo no seu aplicativo, você poderá usar alguma solução em nuvem como o Azure Blob Storage ou o Azure Media Services (se precisar de alguns recursos específicos de mídia / streaming). Com o Azure Blob, você pode carregar / baixar arquivos rapidamente e sem sobrecarregar seu aplicativo.
Guilherme Meinlschmiedt Abdo 04/01

Respostas:

6

Se você deseja transmitir o vídeo no navegador, seu servidor deve suportar solicitações de intervalo HTTP . Nesse caso, o servidor pode enviar apenas uma pequena parte do conteúdo solicitado pelo cliente. Como você deseja transmitir vídeo no navegador, pode usar a videotag html que solicita um conteúdo usando os cabeçalhos de intervalo. Portanto, você também pode pular um pouco e reproduzir imediatamente o filme a partir dessa posição, antes de fazer o download completo.

O ASP.NET Core 3 já tem suporte para solicitações de intervalo HTTP; é implementado no PhysicalFilemétodo que possui o atributo enableRangeProcessing . Como a documentação diz:

Retorna o arquivo especificado por physicalPath (Status200OK), o contentType especificado como o Tipo de Conteúdo e o fileDownloadName especificado como o nome do arquivo sugerido. Isso suporta solicitações de intervalo (Status206PartialContent ou Status416RangeNotSatisfiable se o intervalo não for satisfatório).

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

Observe que o caminho deve ser absoluto (não relativo).

maionese
fonte
Vou tentar isso, muito obrigado pela sua resposta!
Lukas Köhler