音頻視頻的播放的進度調整(以.net爲例)

Background:對於音視頻在線播放,一些小應用是靠nginx處理訪問視頻、音頻文件的請求,對外應用的通常會託管至各類雲上使用相關的服務。前者存在巨大的安全隱患,後者會有必定的成本。有的時候仍是須要本身造個輪子。html

step 1:先實現文件下載前端

[HttpGet] public IActionResult Get() { var filePath = @"E:\test.wav"; var name = @"tes1t.wav"; FileStream fs = new FileStream(filePath, FileMode.Open); return  File(fs, "application/octet-stream", name); }

前面的audio標籤是能夠播放和正常下載的,可是並不能實現進度控件的調整nginx

step2:請求的區別安全

Nginx的處理是能夠實現播放進度調整的。在前端請求相同的狀況下,二者用nginx代理和剛纔的下載的主要區別以下:app

能夠看出Content-Range對應的正是請求頭中的Rangeide

關於這幾個頭部信息可參考這篇文章:https://blog.csdn.net/thewindkee/article/details/80189434spa

這3個標籤同時也是文件實現斷點續傳的關鍵。.net

step3:斷點續傳代理

這樣進度的調整就轉化爲了斷點續傳功能。code

.net可參考:http://www.javashuo.com/article/p-wjbuzpjd-dm.html

 1  public FileStreamResult Index(string auth,string filename)  2  {  3             if (auth != null && auth.Length >7)  4  {  5                  // 處理權限問題
 6  }  7             else
 8  {  9                 return null; 10  } 11             
12             int size, end, length = 0; 13             int start; 14 
15  MemoryStream Mstream; 16             using (FileStream reader = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) 17  { 18                 byte[] bytes = new byte[reader.Length]; 19                 //var strd = new StreamReader(reader);
20 
21                 size = bytes.Length; 22                 start = 0; 23                 end = size - 1; 24                 length = size; 25                 Response.Headers["Accept-Ranges"] = "0-" + size; 26                 if (!String.IsNullOrEmpty(Request.Headers["Range"])) 27  { 28                     int anotherStart = start; 29                     int anotherEnd = end; 30                     var headerRange = Request.Headers["Range"]; 31                     string[] arr_split = headerRange.FirstOrDefault().Split(new char[] { Convert.ToChar("=") }); 32  Debug.WriteLine(arr_split); 33                     string range = arr_split[1]; 34                     if (range.IndexOf(",") > -1) 35  { 36                         Response.Headers["Content-Range"] = "bytes " + start + "-" + end + "/" + size; 37 
38                         Response.StatusCode = 416; 39 
40  } 41                     if (range.StartsWith("-")) 42  { 43                         // The n-number of the last bytes is requested
44                         anotherStart = size - Convert.ToInt32(range.Substring(1)); 45  } 46                     else
47  { 48                         arr_split = range.Split(new char[] { Convert.ToChar("-") }); 49                         anotherStart = Convert.ToInt32(arr_split[0]); 50                         int temp = 0; 51                         anotherEnd = (arr_split.Length > 1 && Int32.TryParse(arr_split[1].ToString(), out temp)) ? Convert.ToInt32(arr_split[1]) : size; 52  } 53                     anotherEnd = (anotherEnd > end) ? end : anotherEnd; 54                     if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size) 55  { 56                         Response.Headers["Content-Range"] = "bytes " + start + "-" + end + "/" + size; 57                         Response.StatusCode = 416; 58 
59  } 60                     start = anotherStart; 61                     end = anotherEnd; 62                     length = end - start + 1; // Calculate new content length
63  reader.Read(bytes, start, length); 64                     Response.StatusCode = 206; 65  } 66                 else
67  { 68                     reader.Read(bytes, 0, bytes.Length); 69  } 70                 Mstream = new MemoryStream(bytes); 71  } 72             Response.Headers["Content-Range"] = "bytes " + start + "-" + end + "/" + size; 73             Response.Headers["Content-Length"] = length.ToString(); 74             Response.Headers.Add("Content-Disposition", "attachment; filename=download.wav"); 75             return new FileStreamResult(Mstream, "applicaton/octet-stream"); 76         }
.netcore 2.2 修改版本
相關文章
相關標籤/搜索