2016-04-07 12 views
1

私は、FileStream経由でSQL Serverからビデオを読み込むことができるASP.NET(C#)Webアプリケーションを作成しています。私は単純さのためにHTML5ビデオコントロールを使用しています。私は、FileStreamをからの映像を供給で探していますがあれば、私はで終わる、ファイルがあるとして、この作品HTML5 SQLストリームからのビデオストリーミング

<video controls id="vidPlayer" runat="server" width="420"> 
    <source src="Content/Video/video.mp4" type="video/mp4"> 
    Your browser does not support HTML5 video. 
</video> 

:私はそれがプロジェクトに保存されたMP4ファイルのために働いて得るために管理していますByte配列とは何も関係がありません。

  SqlConnection con = new SqlConnection(constr); 
      con.Open(); 

      //Retrieve the FilePath() of the video file 
      SqlCommand sqlCommand = new SqlCommand(); 
      sqlCommand.Connection = con; 
      sqlCommand.CommandText = "SELECT EvidenceFS FROM [EP].[t_TraineeUploadedEvidence] WHERE ID = 'A5E262F8-6465-41C1-BD34-42EBCB492C87'"; 
      byte[] buffer = (byte[])sqlCommand.ExecuteScalar(); 


      MemoryStream ms = new MemoryStream(buffer); 

      vidPlayer.Src = ???? 

      //Cleanup 
      con.Close(); 

私は助けをカントが、私はちょうど私はそれは簡単です願っています...簡単な何かが欠けています感じる:私は現在、コードを持っています!私はこの分野に比較的新しいので、どんな助けもありがとう!

私の詳細情報が必要な場合はお知らせください。私もオーディオと同じことをする必要がありますが、私は、いずれの解決策もうまくいけば両方の問題に対処しなければならないことを願っています。

答えて

1

私は最終的に私が必要としたものを得ることができました。以下は、私が正しい方向に向いていることを確かに助けたように、上記の反応に対する賞賛をしていたことです。だから、ビデオプレーヤーのコントロールは、ソースなしでのaspxファイルに存在:

 <video controls id="vidPlayer" runat="server" width="500" style="display:none" > 
      Your browser does not support HTML5 video. 
     </video> 

およびSQLファイルストリームからデータを取得するため、次のWebハンドラ:

public class FileStreamHandler1 : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     int id = int.Parse(context.Request.QueryString["id"]); 
     byte[] bytes; 
     string contentType; 
     string strConnString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString; 
     string name; 

     using (SqlConnection con = new SqlConnection(strConnString)) 
     { 

      using (SqlCommand cmd = new SqlCommand("[EPORTAL].[LearnerLoginGetEvidenceFile]")) 
      { 
       using (SqlDataAdapter sda = new SqlDataAdapter()) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@EvidenceID", id); 
        cmd.Connection = con; 

        con.Open(); 
        SqlDataReader sdr = cmd.ExecuteReader(); 
        sdr.Read(); 
        bytes = (byte[])sdr["Data"]; 
        contentType = sdr["ContentType"].ToString(); 
        name = sdr["Name"].ToString(); 
        con.Close(); 
       } 

      } 
      context.Response.Clear(); 
      context.Response.Buffer = true; 
      context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + name); 
      context.Response.ContentType = contentType; 
      context.Response.BinaryWrite(bytes); 
      context.Response.End(); 
     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
レコードIDは、私が探しています

forはクエリ文字列を渡されます。これは、単に以下と後ろのコードで呼ばれる:

vidPlayer.Src = "FileStreamHandler.ashx?Id=" + SelectedEvID.ToString(); 
SelectedEvIDがGridViewの中で選択された行から取得され

これは、これが他の誰かが同じものを実装するのを助けてくれることを願っています。

1

これは私が使用しているものです。

[HttpGet, Route("yourApi")] 
public HttpResponseMessage grabMyStream(string fileName) 
{ 
string mimeType = MimeMapping.GetMimeMapping(fileName); 

     MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse(mimeType); 

     Stream inputStream = getYourStream(); 

     var response = Request.CreateResponse(); 
     response.Content = new PushStreamContent(
      async (outputStream, httpContent, transportContext) => 
      { 
       byte[] buffer = new byte[65536]; 
       int read = 0; 
       while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        await outputStream.WriteAsync(buffer, 0, buffer.Length); 
       } 

      }, mediaType); 

     return response; 
} 

<video controls id="vidPlayer" runat="server" width="420"> 
    <source src="yourApi?fileName=video.mp4" type="video/mp4"> 
    Your browser does not support HTML5 video. 
</video> 

最後に拡張子があるため、ファイル名を渡す際にクエリ文字列を使用します。

EDIT:getYourStream()メソッドは、MemoryStreamを返す場所です。 HTMLが読み込まれると、HTML5ビデオはGETリクエストをsrcに送信します。したがって、srcはAPIメソッドを指す必要があります。これはAsp.Net Web Apiを使用していると仮定しています。

注:ストリームの部分をどこかから引っ張っていた場合は、直接outputStreamに書き込むことになります。これは、ストリーム全体を一度にしてから、ストリームごとにストリームできるように書かれています。それは非効率的ですが、それは私のプロジェクトの要件でした。ストリームを一度に少しずつストリーミングする必要がなく、ストリーム全体を一度に(そのように見えるように)持っていれば、代わりにApiメソッドからストリーム全体を返すだけです。

+0

ありがとうBobbyJ - あなたのコードを自分のコードに転記する方法が正確にわからないのですか?私は助けができないが、他に何が起こっているのかを理解していないと思っています...これは機能ですか? 'getYourStream()'とは何ですか? ... – CJH

+0

私は応答を高く評価していますので、他の情報があれば役立つでしょう。 – CJH

+0

さて、これはもう少し意味をなさないようになっている..しかし、私の問題は基本的にはビデオをリストするgridviewを必要とし、Gridviewのリンクボタンをクリックするとビデオコントロールのビデオが開きます。私はあなたの提案を受け入れるために努力していますが、選択されたIDをWeb APIに渡すことにあまり幸運をもたらさないようにしています(さらに、Request.CreateResponse()の問題を取得しています - タイプ 'HttpRequestMessage'の受信者が必要です。 – CJH

1

私はBobbyJのように、あなたのビデオコントロールがmp4ファイルを読み込む外部URLを作る必要があると思います。 たとえば、これはシンプルなビデオコントロールです(ここからはhttps://www.w3.org/wiki/HTML/Elements/video)。代わりにあなたがあなたのファイルが返されます、URLとWebサービス(WCFやWeb APIまたはものは何でもしたい)を使用することができます「http://media.w3.org/2010/05/bunny/movie.ogv」URLの

<video controls 
    src="http://media.w3.org/2010/05/bunny/movie.ogv"> 
Your user agent does not support the HTML5 Video element. 
</video> 

関連する問題