Прогрессивная потоковая передача по Mp4 с использованием ASP.NET - PullRequest
0 голосов
/ 16 марта 2012

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

Пример сценария, который я использую

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();
}

Я думаю, что проблема в следующей строке, если я удаляю ее, видео все еще может воспроизводиться, но с самого начала if (позиция> 0) { fs.Position = position; } Может быть начальный заголовок mp4, подобный используемому в потоковой передаче flv для отслеживания позиции поиска, из-за которой поток не может быть распознан, если позиция поиска> 0

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

Привет.

1 Ответ

0 голосов
/ 15 июня 2015

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

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

...