ASP.NET Core 3を使用したビデオのストリーミング


8

現在、.NET Coreを使用した最初のプロジェクトとして、ASP.NET Core 3でAPIを構築しています。

私は現在、React.jsフロントエンドにビデオを送信してブラウザーで視聴しようとしています。ファイルとビデオのアップロードは問題なく機能し、以下に表示されている方法でもファイルがクライアントに送信されますが、ビデオが数秒より長い場合、ビデオプレーヤーは本当に遅く、スキップするのにも長い時間がかかりますビデオの数秒。それは、ファイルが最初に完全にダウンロードされてから再生されるためだと思います。

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

私の問題を解決する方法は、ファイルをストリーミングすることであり、全体として送信することではないと思います。ASP.NET Core 3でビデオをストリーミングする方法についてはすでにグーグル検索しましたが、ASP.NET Core 2について説明しているWebサイトしか見つかりません(例:http : //anthonygiretti.com/2018/01/16/streaming-video-asynchronously -in-asp-net-core-2-with-web-api /

私はすでにこれらのWebサイトでコードを使用しようとしましたが、その方法はASP.NET Core 3と互換性がありません。

ASP.NET Core 3でファイルをストリーミングするにはどうすればよいですか?


1
これらのビデオファイルをアプリに転送して保存する必要がない場合は、Azure Blob StorageやAzure Media Servicesなどのクラウドソリューションを使用できます(特定のメディア/ストリーミング機能が必要な場合)。Azure Blobを使用すると、アプリケーションにオーバーヘッドをかけることなく、ファイルをすばやくアップロード/ダウンロードできます。
Guilherme Meinlschmiedt Abdo

回答:


6

ブラウザでビデオをストリーミングする場合は、サーバーがHTTP範囲リクエストをサポートしている必要があります。このような場合、サーバーはクライアントから要求されたコンテンツのごく一部を送信できます。ブラウザでビデオをストリーミングしたいので、video範囲ヘッダーを使用してコンテンツを要求するhtmlタグを使用できます。したがって、完全にダウンロードされる前に、しばらくスキップしてすぐにその位置からムービーを再生することもできます。

ASP.NET Core 3はすでにHTTP範囲リクエストをサポートしており、enableRangeProcessingPhysicalFile属性を持つメソッドに実装されています。ドキュメントが言うように:

physicalPath(Status200OK)で指定されたファイル、Content-Typeとして指定されたcontentType、および推奨されるファイル名として指定されたfileDownloadNameを返します。これは範囲リクエストをサポートします(範囲が満たされない場合はStatus206PartialContentまたはStatus416RangeNotSatisfiable)。

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

パスは絶対パスでなければならないことに注意してください(相対パスではありません)。


やってみます、返事ありがとうございます!
LukasKöhler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.