Как мне транслировать .flv файлы из базы данных SQL - PullRequest
12 голосов
/ 09 декабря 2010

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

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

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

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

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

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 10 декабря 2010

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

Я использую 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 1011 *
Функция добавляет игрока в <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 голосов
/ 09 декабря 2010

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

1 голос
/ 09 декабря 2010

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

...