限制mp4视频流的带​​宽达到一定限度

时间:2014-03-07 04:57:14

标签: c# asp.net streaming

我正在使用以下mp4流媒体脚本在html5播放器上播放mp4视频。

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

}

然而它运作正常。现在我有场景,我需要限制付费和免费用户的流带宽。付费用户的带宽速度(kbps)是免费用户的两倍。

对于这个i综合带宽限制脚本http://www.codeproject.com/Articles/18243/Bandwidth-throttling

所以我在上面的函数中替换下面的代码

length = end - start + 1; // Calculate new content length
fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);

long speed = 1024000; // 1024kbps
length = end - start + 1; // Calculate new content length
Stream throttle = new ThrottledStream(reader.BaseStream, speed);
fp = throttle.Seek(start, SeekOrigin.Begin);

但它不起作用。 任何人都可以帮助我如何在上面的例子中限制流。

0 个答案:

没有答案