web-dev-qa-db-ja.com

ASP.NET MVCを使用してビデオファイルをストリーミングするにはどうすればよいですか?

私は人々がオーディオとビデオファイルにアクセスできるウェブサイトを開発しています。ファイルをダウンロードするためのコードがあり、次の2つのアクションメソッドで構成されています...

public ActionResult GetAudioFile(int id) {
  return GetFile(id, true);
}

public ActionResult GetVideoFile(int id) {
  return GetFile(id, false);
}

private ActionResult GetFile(int id, bool isAudio) {
  // Code to get info about the file, etc omitted for clarity
  string downloadFileName = // full path to audio/video file
  byte[] bytes = GetFileBytes(fileName); // also omitted
  return File(bytes, (isAudio ? "audio/mpeg" : "video/mp4"), downloadFileName + (isAudio ? ".mp3" : ".mp4"));
}

これらはどちらも正常に動作し、どちらのタイプのファイルもダウンロードできます。

次に、2つのRazorビューを追加します。1つはオーディオファイルを聞くため、もう1つはビデオを表示するためです。私はオーディオビューで次のことを行いました、そしてそれはうまくいきます...

<audio src='@Url.Action("GetAudioFile", "Search", new {ID = @Model.ID})'
               controls preload="auto"></audio>

次に、ビデオビューについても同じことを試みました...

<video src='@Url.Action("GetVideoFile", "Search", new {ID = @Model.ID})' 
               controls preload="auto" width="640" height="368"></video>

ただし、実行しようとすると、System.OutOfMemoryExceptionが発生します。動画の平均はそれぞれ約400〜500Mbです。

次に、Response.TransmitFileメソッドを次のように使用してみました...

  Response.ContentType = "video/mp4";
  Response.AddHeader("content-disposition", "attachment; filename=myvideo.mp4"));
  Response.TransmitFile(fileName);
  Response.End();
  return null;

...しかし、それはうまくいきません。 Chromeでは、コンソールに「リソースはドキュメントとして解釈されたがMIMEタイプvideo/mp4で転送されました」というメッセージが表示され、FireFoxではビデオコントロールに同じメッセージが表示されます。

誰か私がこれをどのように修正できるか考えていますか?理想的には、ファイルが完全にダウンロードされるまで待たせるのではなく、最初のバイトがユーザーに到達するとすぐに再生を開始するように、ファイルをストリーミングしたいと思います。

私はいくつかのJavascriptビデオプレーヤーを試しましたが、どちらでも成功しました。

更新 Webブラウザを直接ビデオファイルに向けてみましたが、オーディオプレーヤーのように見えましたが、ビデオペインで、再生ボタンをクリックしても何も起こりません。それが役立つかどうかはわかりません。

11
Avrohom Yisroel

FileMvcControllerメソッドはFileContentResultを返します。後者はコンテンツをストリーミングしません。私の知る限り、MvcControllerはストリーミングをまったくサポートしていません。

ApiControllerPushStreamContentを試してみてください。後者の場合、コールバックメソッドを介して出力ストリームに非同期で書き込むことができます。そのためには、ソリューションで実際のストリームを操作する必要があります。一緒に働く byte[]は常にファイルの内容全体をメモリにロードします。

詳細なチュートリアルはこちらをご覧ください: ASP.NET Web APIを使用した非同期ストリーミングビデオ

6
bstenzel

データベース/ PCからビデオを再生するための可能な方法

<div height="240" width="320" controls>
      <video>
             <source src="@Url.Content(Model.VideoTable.VideoPath)" type='video/mp4' />
      </video>
</div>

ソースプロパティは文字列ではなくURLを取得する必要があります。

そう @Url.ContentビデオパスをURLに変換します

0
WasiF