2010-12-09 2 views
12

Я хочу хранить .flv-файлы в базе данных, а не в файловой системе.Как я могу передать FLV-файлы из базы данных SQL

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

То, что я не могу сделать, это:
.flv видео класс, сформированный с учетом способностей учащихся к JW Player непосредственно из базы данных. (Хранится как двоичные данные)

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

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

Заранее благодарен!

+4

+1 нечестивый интересный вопрос – jcolebrand 2010-12-09 18:17:58

+0

Вы бы разместить надрез или обсудить, как вы потоковый .flv, когда он находится на файловой системе? – 2010-12-09 18:55:27

+0

Просто используйте код в своем ответе, но с FileStream() вместо SqlDataReader() – Niklas 2010-12-10 16:04:26

ответ

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

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

+0

А, очень полезно знать! – Niklas 2010-12-10 16:02:58

2

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

Смежные вопросы