7

私は以前この技術をhttp://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/に使用しており、非同期のビデオストリーミングに最適でした。ASP.Net Core Web APIの非同期ビデオストリーミングは動作しません。

しかし、ASP.NET Coreの場合、この方法は期待どおりに機能しません。

public class VideoStream 
{ 
    private readonly string _filename; 
    public VideoStream(string filename) 
    { 
     _filename = filename; 
    } 

    public async Task WriteToStream(Stream outputStream, HttpContent content, TransportContext context) 
    { 
     try 
     { 
      var buffer = new byte[65536]; 
      using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read)) 
      { 
       var length = (int)video.Length; 
       var bytesRead = 1; 
       while (length > 0 && bytesRead > 0) 
       { 
        bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length)); 
        await outputStream.WriteAsync(buffer, 0, bytesRead); 
        length -= bytesRead; 
       } 
      } 
     } 
     catch (Exception) 
     { return; } 
     finally 
     { 
      outputStream.Flush(); 
      outputStream.Dispose(); 
     } 
    } 
} 

と私はビデオストリーミング要求に対して次のアクションがあります:ビデオストリーミングクラスによって

があるデフォルトAsp.Netコアで組み込まれていませんので、メディア

[HttpGet] 
    [Route("[action]")] 
    public IActionResult GetVideo(int id) 
    { 
     var fileName = GetVideoFileName(id); 
     var video = new VideoStream(fileName); 
     var response = new HttpResponseMessage 
     { 
      Content = new PushStreamContent(video.WriteToStream, new MediaTypeHeaderValue("video/mp4")) 
     }; 
     var objectResult = new ObjectResult(response); 
     objectResult.ContentTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("video/mp4")); 
     return objectResult; 
    } 

をビデオ/ mp4用フォーマッタ私は以下のカスタムメディアフォーマッタを作成しました

public class VideoOutputFormatter : IOutputFormatter 
{ 
    public bool CanWriteResult(OutputFormatterCanWriteContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException(nameof(context)); 
      return true; 
    } 
    public async Task WriteAsync(OutputFormatterWriteContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException(nameof(context)); 
     var response = context.HttpContext.Response; 
     response.ContentType = "video/mp4"; 

     How to impelemnt ??? 
    } 
} 

私のカスタムフォーマッタを実際に呼び出します。 video/mp4用のこのカスタムメディアフォーマッタの実装方法はわかりません。 誰でも私を助けることができますか?

答えて

3

Asp.NET Coreのソースコードを見ると、本当にこの回答が見つかりました。彼らはあなたが使用したいものに本当に近い、StreamOutputFormatterクラスを持っています。私はPushStreamContentを探すためにそれを修正しなければならず、それは魅力のように働いた。ここで

は私の完全なVideoOutputFormatterです:

public class VideoOutputFormatter : IOutputFormatter 
{ 
    public bool CanWriteResult(OutputFormatterCanWriteContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException(nameof(context)); 

     if (context.Object is PushStreamContent) 
      return true; 

     return false; 
    } 

    public async Task WriteAsync(OutputFormatterWriteContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException(nameof(context)); 

     using (var stream = ((PushStreamContent)context.Object)) 
     { 
      var response = context.HttpContext.Response; 
      if (context.ContentType != null) 
      { 
       response.ContentType = context.ContentType.ToString(); 
      } 

      await stream.CopyToAsync(response.Body); 
     } 
    } 
} 

の代わりに、あなたのコントローラにObjectResultHttpResponseMessageを包む、あなただけの代わりにObjectResultPushStreamContentオブジェクトを突き出すしたいと思います。まだObjectResultMediaTypeHeaderValueを設定する必要があります。

+0

共有してくれてありがとうございますが、純粋なコアにPushStreamContentが見つかりませんでした。サンプルがありますか? – Soren

+1

@Soren残念ながら、私は解決策を見つけることができず、nginxのようなリバースプロキシを介してビデオを配信するだけでした。 – villecoder

関連する問題