web-dev-qa-db-ja.com

FileStreamからのビデオストリーミング用の.NET Core 2.0 Web API

アプリケーション内で使用できないオブジェクトを使用し、.NET Core Web APIのバージョンと一致しないように見える多くの例を見つけました。本質的に、私はWebページに<video>タグがあり、パスを介してファイルを直接提供するのではなく、サーバーからのストリームを使用してビデオをロードしたいプロジェクトに取り組んでいます。 1つの理由は、ファイルのソースが変更される可能性があり、パスを介してそれらを提供することが私の顧客の望んでいないことです。だから私はストリームを開き、非同期でビデオファイルを書き込むことができる必要があります。

これは何らかの理由でJSONデータを生成するため、誤りです。しかし、ストリーミングビデオファイルをHTMLの<video>タグに送信するために何をする必要があるのか​​理解できません。

現在のコード:

[HttpGet]
public HttpResponseMessage GetVideoContent()
{
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs))
    {
        using (var file = fs)
        {
            var range = Request.Headers.GetCommaSeparatedValues("Range").FirstOrDefault();
            if (range != null)
            {
                var msg = new HttpResponseMessage(HttpStatusCode.PartialContent);
                var body = GetRange(file, range);
                msg.Content = new StreamContent(body);
                msg.Content.Headers.Add("Content-Type", "video/mp4");
                //msg.Content.Headers.Add("Content-Range", $"0-0/{fs.Length}");
                return msg;
            }
            else
            {
                var msg = new HttpResponseMessage(HttpStatusCode.OK);
                msg.Content = new StreamContent(file);
                msg.Content.Headers.Add("Content-Type", "video/mp4");
                return msg;
            }
        }
    }
    else
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
}
6
Bailey Miller

HttpResponseMessageasp.net-coreの戻り値の型としては使用されません。既に観察したように、それをオブジェクトモデルとして読み取り、応答でシリアル化します。

幸いなことに、ASP.NET Core 2.0では、

拡張HTTPヘッダーサポート

アプリケーションのビジターがRange Requestヘッダーでコンテンツをリクエストすると、ASP.NETはそれを認識してそのヘッダーを処理します。要求されたコンテンツを部分的に配信できる場合、ASP.NETは適切にスキップし、要求されたバイトのセットのみを返します。この機能を適応または処理するために、メソッドに特別なハンドラーを記述する必要はありません。自動的に処理されます。

だから今あなたがしなければならないすべてはファイルストリームを返すことです

[HttpGet]
public IActionResult GetVideoContent() {
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs)) {        
        return new FileStreamResult(fs, new MediaTypeHeaderValue("video/mp4").MediaType);
    }

    return BadRequest();
}

そこからは、ビデオクライアントからエンドポイントをポイントして、魔法をかけるだけです。

11
Nkosi