Truyền phát video với ASP.NET Core 3


8

Tôi hiện đang xây dựng API trong ASP.NET Core 3 là dự án đầu tiên của tôi với .NET Core.

Tôi hiện đang cố gắng gửi video tới giao diện React.js của mình để xem video đó trong trình duyệt. Tải lên tệp và video không hoạt động mà không có vấn đề gì và phương pháp bạn nhìn thấy bên dưới cũng đã gửi tệp cho khách hàng nhưng nếu video dài hơn vài giây, trình phát video rất chậm và cũng mất nhiều thời gian để bỏ qua một vài giây của video. Tôi nghĩ đó là vì tập tin đầu tiên được tải xuống hoàn toàn và hơn là chơi.

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

Tôi nghĩ rằng cách để giải quyết vấn đề của tôi là truyền phát tệp và không gửi toàn bộ. Tôi đã tìm hiểu về cách truyền phát video với ASP.NET Core 3 nhưng tôi chỉ tìm thấy các trang web giải thích nó cho ASP.NET Core 2 (ví dụ: http://anthonygiretti.com/2018/01/16/streaming-video-asyn đồng bộ -in-asp-net-core-2-with-web-api / )

Tôi đã thử sử dụng mã trên các trang web này nhưng cách họ đã thực hiện không tương thích với ASP.NET Core 3.

Làm cách nào để truyền phát tệp trong ASP.NET Core 3?


1
Nếu không thực sự cần thiết phải chuyển và lưu trữ các tệp video đó trong ứng dụng của bạn, bạn có thể sử dụng một số giải pháp đám mây như Azure Blob Storage hoặc Azure Media Services (nếu bạn cần một số khả năng truyền phát / truyền thông cụ thể). Với Azure Blob, bạn có thể tải lên / tải xuống các tệp nhanh chóng mà không cần quá tải ứng dụng của mình.
Guilherme Meinlschmiedt Abdo

Câu trả lời:


6

Nếu bạn muốn truyền phát video trong trình duyệt, máy chủ của bạn sẽ hỗ trợ các yêu cầu phạm vi HTTP . Trong trường hợp như vậy, máy chủ chỉ có thể gửi một phần nhỏ nội dung do khách hàng yêu cầu. Khi bạn muốn truyền phát video trong trình duyệt, bạn có thể sử dụng videothẻ html yêu cầu nội dung bằng các tiêu đề phạm vi. Do đó, bạn cũng có thể bỏ qua một thời gian và ngay lập tức phát phim từ vị trí đó, trước khi nó được tải xuống hoàn toàn.

ASP.NET Core 3 đã hỗ trợ các yêu cầu phạm vi HTTP, nó được triển khai theo PhysicalFilephương thức có thuộc tính enableRangeProcessing . Như tài liệu nói:

Trả về tệp được chỉ định bởi vật lý (Status200OK), ContentType được chỉ định làm Kiểu nội dung và tệp được chỉ địnhD DownloadName làm tên tệp được đề xuất. Điều này hỗ trợ các yêu cầu phạm vi (Status206PartialContent hoặc Status416RangeNotSatisfisf nếu phạm vi không thỏa đáng).

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

Lưu ý rằng đường dẫn phải tuyệt đối (không tương đối).


Tôi sẽ thử điều đó, cảm ơn rất nhiều vì phản hồi của bạn!
Lukas Köhler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.