12

.flv ファイルをファイル システムではなくデータベースに保存したいと考えています。

これは私が今できることです:
ffmpeg で .wmv と .mpeg を .flv に正常に変換します。
画像を SQL Server に保存し、httphandler を使用してページに表示します。
.avi および .mpeg ビデオと同じです。
ファイルがデータベースではなくファイル システムにある場合は、ブラウザで .flv ファイルを再生します 。

私ができないこと:
.flv ビデオをデータベースから直接 JW Player にストリーミングします。(バイナリデータとして格納)

2日間インターネットを検索しましたが、うまくいきません。私はほとんどそこにいるように感じます。JW Player が開き、「バッファリング」を開始しますが、何も起こりません。

簡単な答えがないことは承知していますが、以前にこれを行ったことがあるか、または同様のことをしたことがある場合は、どのように行ったかを知りたいです. ここにすべてを投稿するにはコードが多すぎると感じています。

前もって感謝します!

4

3 に答える 3

4

私はそれを機能させましたが、それがどれほど効率的かについてはわかりません。接続、効率、負荷などの点で、データベースからではなく、ファイル システムからストリーミングするほうがよいでしょうか。

ここではJW Playerを使用しているため、「swfobject.js」と「player.swf」

httpHandler:

public class ViewFilm : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            // Check if id was given
            if (context.Request.QueryString["id"] != null)
            {
                string movId = context.Request.QueryString["id"];

                // Connect to DB and get the item id
                using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
                using (SqlCommand cmd = new SqlCommand("GetItem", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter sqlParam = cmd.Parameters.Add("@itemId", SqlDbType.Int);
                    sqlParam.Value = movId;

                    con.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr.HasRows)
                        {
                            dr.Read();
                            // Add HTTP header stuff: cache, content type and length
                            context.Response.Cache.SetCacheability(HttpCacheability.Public);
                            context.Response.Cache.SetLastModified(DateTime.Now);
                            context.Response.AppendHeader("Content-Type", "video/x-flv");
                            context.Response.AppendHeader("Content-Length", ((byte[])dr["data"]).Length.ToString());
                            context.Response.BinaryWrite((byte[])dr["data"]);
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.ToString());
        }
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

javascript
関数はプレーヤーを追加し、<div id="video1">たとえばユーザーがボタンをクリックしたときに呼び出すことができます。

<script type='text/javascript' src='swfobject.js'></script>
<script type="text/javascript" language="javascript">
function vid() {
  var s1 = new SWFObject('player.swf', 'player1', '480', '270', '9');
  s1.addParam('allowfullscreen', 'true');
  s1.addParam('allowscriptaccess', 'always');
  s1.addVariable('file', encodeURIComponent('ViewFilm.ashx?id=10'));
  s1.addVariable('type', 'video');
  s1.write(document.getElementById("video1"));
}
</script>
于 2010-12-10T15:57:59.970 に答える
2

「データベースから直接ストリーム」を文字通りどのように取得するかは正確にはわかりませんが、JW Player のソース「ファイル」を「ServeFLV.aspx?id=123」に設定し、ServeFLV.aspx にバイトを取得させることはできますか?データベースにアクセスし、マークアップなしで応答に書き出しますか?

于 2010-12-09T19:35:12.340 に答える
1

SQL Server 2008を使用している場合は、varbinary(MAX)FILESTREAMを使用できます。これにより、ファイルをデータベースで管理しながら、.NETからFileStreamにアクセスできます。

于 2010-12-09T18:11:47.110 に答える