如何从SQL数据库传输.flv文件

时间:2023-01-13 18:06:30

I want to store .flv files in the database and not in the file system.

我想将.flv文件存储在数据库中,而不是存储在文件系统中。

This is what I can do right now:
Successfully convert .wmv and .mpeg to .flv with ffmpeg.
Store images in SQL Server and show them on my page with an httphandler.
Same with .avi and .mpeg videos. (It's up to the user's software if he can view it though)
Play .flv files in the browser if the file is located in the file system and not in the database.

这就是我现在可以做的:使用ffmpeg成功将.wmv和.mpeg转换为.flv。将图像存储在SQL Server中,并使用httphandler在我的页面上显示它们。与.avi和.mpeg视频相同。 (这取决于用户的软件,如果他可以查看它)如果文件位于文件系统而不是数据库中,则在浏览器中播放.flv文件。

What I can't do is:
Stream .flv videos to JW Player directly from the database. (Stored as binary data)

我不能做的是:直接从数据库中将.flv视频直播到JW Player。 (存储为二进制数据)

I've searched the internet for two days now but I can't get it to work. It feels as if I'm almost there though. The JW Player opens up and starts to "buffer", but nothing happens.

我已经在互联网上搜索了两天,但我无法让它工作。感觉好像我几乎在那里。 JW Player打开并开始“缓冲”,但没有任何反应。

I know there's no easy answer but if anyone has done this before, or something similar, I'd like to know how you did. I feel I've got too much code to post it all here.

我知道没有简单的答案,但如果有人之前做过这个,或类似的事情,我想知道你是怎么做的。我觉得我有太多的代码要在这里发布。

Thanks in advance!

提前致谢!

3 个解决方案

#1


4  

I got it to work but I have no idea as to how efficient it is. Is it better to stream from the file system than from the database in terms of connections, efficency, load etc. I could use some pointers on this!

我得到了它的工作,但我不知道它是多么有效。在连接,效率,负载等方面,从文件系统流式传输比从数据库传输更好。我可以使用一些指针!

I'm using JW Player here, hence "swfobject.js" and "player.swf"

我在这里使用JW Player,因此“swfobject.js”和“player.swf”

httpHandler:

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
The function adds a player to <div id="video1"> and can be called e.g when a user clicks a button.

javascript该函数将播放器添加到

,并且可以在用户单击按钮时调用。

<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>

#2


2  

Not sure exactly how literally to take "stream directly from the database", but would it work to set the source "file" for the JW Player to "ServeFLV.aspx?id=123", and have ServeFLV.aspx retrieve the bytes from the database, and write them out to the response with no markup?

不确定从字面上直接从数据库中获取流的确切方式,但它是否可以将JW Player的源“文件”设置为“ServeFLV.aspx?id = 123”,并让ServeFLV.aspx从中检索字节数据库,并将它们写入没有标记的响应?

#3


1  

If you're using SQL Server 2008 you could use varbinary(MAX) FILESTREAM which would allow the files to be managed by the database but still give you access to a FileStream from .NET.

如果您使用的是SQL Server 2008,则可以使用varbinary(MAX)FILESTREAM,它允许文件由数据库管理,但仍允许您从.NET访问FileStream。

#1


4  

I got it to work but I have no idea as to how efficient it is. Is it better to stream from the file system than from the database in terms of connections, efficency, load etc. I could use some pointers on this!

我得到了它的工作,但我不知道它是多么有效。在连接,效率,负载等方面,从文件系统流式传输比从数据库传输更好。我可以使用一些指针!

I'm using JW Player here, hence "swfobject.js" and "player.swf"

我在这里使用JW Player,因此“swfobject.js”和“player.swf”

httpHandler:

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
The function adds a player to <div id="video1"> and can be called e.g when a user clicks a button.

javascript该函数将播放器添加到

,并且可以在用户单击按钮时调用。

<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>

#2


2  

Not sure exactly how literally to take "stream directly from the database", but would it work to set the source "file" for the JW Player to "ServeFLV.aspx?id=123", and have ServeFLV.aspx retrieve the bytes from the database, and write them out to the response with no markup?

不确定从字面上直接从数据库中获取流的确切方式,但它是否可以将JW Player的源“文件”设置为“ServeFLV.aspx?id = 123”,并让ServeFLV.aspx从中检索字节数据库,并将它们写入没有标记的响应?

#3


1  

If you're using SQL Server 2008 you could use varbinary(MAX) FILESTREAM which would allow the files to be managed by the database but still give you access to a FileStream from .NET.

如果您使用的是SQL Server 2008,则可以使用varbinary(MAX)FILESTREAM,它允许文件由数据库管理,但仍允许您从.NET访问FileStream。