Подтвердить что ты не робот

Как я могу передать FLV файлы из базы данных SQL

Я хочу хранить .flv файлы в базе данных, а не в файловой системе.

Это то, что я могу сделать прямо сейчас:
Успешно конвертировать .wmv и .mpeg в .flv с помощью ffmpeg.
Храните изображения в SQL Server и покажите их на моей странице с помощью httphandler.
То же самое с видео .avi и .mpeg. (Это зависит от пользовательского программного обеспечения, если он может просмотреть его)
Воспроизводите файлы .flv в браузере, если файл находится в файловой системе, а не в базе данных.

Что я не могу сделать:
Поток .flv видео в JW Player непосредственно из базы данных. (Хранится как двоичные данные)

Я искал интернет в течение двух дней, но я не могу заставить его работать. Мне кажется, что я почти там. JW Player открывается и начинает "буферизировать", но ничего не происходит.

Я знаю, что нет простого ответа, но если кто-то сделал это раньше или что-то подобное, я хотел бы знать, как вы это делали. Я чувствую, что у меня слишком много кода, чтобы опубликовать все здесь.

Спасибо заранее!

4b9b3361

Ответ 1

Я получил его для работы, но я понятия не имею, насколько он эффективен. Лучше ли потоки из файловой системы, чем из базы данных с точки зрения соединений, эффективности, нагрузки и т.д. Я мог бы использовать некоторые указатели на этом!

Я использую 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>

Ответ 2

Не уверен, как буквально взять "поток непосредственно из базы данных", но будет ли он работать, чтобы установить исходный "файл" для JW Player на "ServeFLV.aspx? id = 123" и получить ServeFLV.aspx байты из базы данных и записать их в ответ без разметки?

Ответ 3

Если вы используете SQL Server 2008, вы можете использовать varbinary (MAX) FILESTREAM, который позволит управлять файлами с помощью базы данных, но все еще дают вам доступ к FileStream из .NET.