Невозможно загрузить и воспроизвести файлы mp4 / 3gp на iPad - PullRequest
1 голос
/ 30 марта 2012

Я занимаюсь разработкой веб-приложения, с помощью которого пользователь может просматривать файлы на iPad (браузер Safari).Я могу загружать и просматривать файлы .pdf, .doc, .ppt.Но я не могу скачать и просмотреть файлы MP4 и 3GP.Я добавил правильный тип пантомимы в IIS.Я получаю следующую ошибку в Safari (iPad) "BYTE_RANGE_ERROR_MESSAGE".Я использую IIS 7.0 в Windows Server 2008.

Примечание. Я могу загрузить все файлы на ПК с помощью IE, Mozilla и Safari.

1 Ответ

1 голос
/ 30 марта 2012

Пример кода ниже поможет вам транслировать видео mp4 через обработчик asp.net.

private void RangeDownload(string fullpath,HttpContext context)
{
     long size,start,end,length,fp=0;
     using (StreamReader reader = new StreamReader(fullpath))
     {             
        size = reader.BaseStream.Length;       
        start = 0;
        end = size - 1;
        length = size;
       context.Response.AddHeader("Accept-Ranges", "0-" + size);

      if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"]))
      {
          long anotherStart = start;
               long anotherEnd = end;
               string[] arr_split = context.Request.ServerVariables["HTTP_RANGE"].Split(new char[] { Convert.ToChar("=") });
              string range = arr_split[1];

             // Make sure the client hasn't sent us a multibyte range
             if (range.IndexOf(",") > -1)
            {                    
                   context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
                   throw new HttpException(416, "Requested Range Not Satisfiable");

              }


              if (range.StartsWith("-"))
               {
                   // The n-number of the last bytes is requested
                   anotherStart = size - Convert.ToInt64(range.Substring(1));
              }
              else
              {
                  arr_split = range.Split(new char[] { Convert.ToChar("-") });
                  anotherStart = Convert.ToInt64(arr_split[0]);
                long temp = 0;
                   anotherEnd = (arr_split.Length > 1 && Int64.TryParse(arr_split[1].ToString(), out temp)) ? Convert.ToInt64(arr_split[1]) : size;
               }

              anotherEnd = (anotherEnd > end) ? end : anotherEnd;

              if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size)
              {

                  context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
                throw new HttpException(416, "Requested Range Not Satisfiable");
             }
             start = anotherStart;
              end = anotherEnd;

              length = end - start + 1; // Calculate new content length
            fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);
             context.Response.StatusCode = 206;
          }
     }
          // Notify the client the byte range we'll be outputting
      context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
      context.Response.AddHeader("Content-Length", length.ToString());
         // Start buffered download
          context.Response.WriteFile(fullpath, fp, length);
          context.Response.End();

}

Пример использования функции в методе ProcessRequest

string mimetype = "video/mp4";
if (System.IO.File.Exists(file))
{
   context.Response.ContentType = mimetype;
   if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"]))
   {
       //request for chunk
       RangeDownload(file, context);
   }
   else    
   {
       //ask for all 
       long fileLength = File.OpenRead(file).Length;
       context.Response.AddHeader("Content-Length", fileLength.ToString());
       context.Response.WriteFile(file);
   }
}
else
{
    throw new HttpException(404, "Video Not Found Path:" + file);
}

Надеюсь, этот код поможет вам.

...