2012-03-16 6 views
0

У меня возникла проблема при потоковой передаче видео mp4 из любой части или раздела с использованием сценария asp.net. Скрипт работает хорошо, когда вы передаете видео mp4 с начала, но не удалось передать поток, если хотите выбрать любую отправную точку.Прогрессивная потоковая передача Mp4 с использованием ASP.NET

Пример сценария я использую

if (filename.EndsWith(".mp4") && filename.Length > 2) 
{ 
    FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read); 
    // Sample logic to calculate approx length based on starting time. 
    if (context.Request.Params["starttime"] != null && context.Request.Params["d"] != null) 
    { 
     double total_duration = Convert.ToDouble(context.Request.Params["d"]); 
     double startduration = Convert.ToDouble(context.Request.Params["starttime"]); 
     double length_sec = (double)fs.Length/total_duration; // total length per second 
     seekpos = (long)(length_sec * startduration); 
    } 
    if (seekpos==0) 
    { 
     position = 0; 
     length = Convert.ToInt32(fs.Length); 
    } 
    else 
    { 
     position = Convert.ToInt32(seekpos); 
     length = Convert.ToInt32(fs.Length - position); 
    } 
    // 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/mp4"); 
    context.Response.AppendHeader("Content-Length", length.ToString()); 
    if (position > 0) 
    { 
     fs.Position = position; 
    } 
    // Read buffer and write stream to the response stream 
    const int buffersize = 16384; 
    byte[] buffer = new byte[buffersize]; 

    int count = fs.Read(buffer, 0, buffersize); 
    while (count > 0) 
    { 
     if (context.Response.IsClientConnected) 
     { 
      context.Response.OutputStream.Write(buffer,0, count); 
      context.Response.Flush(); 
      count = fs.Read(buffer, 0, buffersize); 
     } 
     else 
     { 
      count = -1; 
     } 
    } 
    fs.Close(); 
} 

Я думаю, что проблема заключается в следующей строке, если я удалить его, видео может быть сыграна, но от начала если (позиция> 0) { фс. Позиция = позиция; } Там может быть, начиная заголовок mp4 как используется в FLV потокового для отслеживания искать положение, благодаря которому поток не может быть признано, если позиция поиска> 0

Может ли один помочь мне в этом.

С уважением.

+1

Возможно, вам стоит рассмотреть некоторые игроки (silverlight или flash), поскольку установка позиции в FileStream работает только в текстовых файлах. очень небольшой шанс работать в mp4. – mslliviu

+0

проблема заключается, например, когда пользователь нажимает на флеш-плеер, такой как jwplayer, он отправляет время запуска потокового скрипта, но потоковый скрипт не может отправлять контент с позиции, откуда он запрашивается в случае mp4, он работает во флеш-флв-случае. он работает при реализации http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Internet-Information-Services-IIS7-Version2, но если это будет хорошо и легко, если работать напрямую через http-скрипт , – irfanmcsd

ответ

0

Вы устанавливаете длину контента в длину файла, а затем отправляете только часть файла.

Кроме того, я не думаю, что вы можете просто разделить видео так, я думаю, вам нужно установить положение файла в начале I-кадра, это означало бы как-то разбор файла mp4 и поиск ближайшего I -frame до нужного вам времени и установить положение файла в этот байт, а затем начать потоковое воспроизведение оттуда.