ToB企服应用市场:ToB评测及商务社交产业平台

标题: 音视频文件提供流式传输之HTTP Range 请求 [打印本页]

作者: 莱莱    时间: 2025-1-17 03:11
标题: 音视频文件提供流式传输之HTTP Range 请求
在 Web 开发中,正确返覆信频和视频流给前端的方式是确保服务器端以流的形式发送媒体文件,而不是将整个文件加载到内存中,然后再传输。这种做法可以进步性能,避免内存溢出,尤其是在处理大文件时。
对于音频和视频流的处理,最常见的技术是 HTTP 流式传输(HTTP Streaming) Range 请求。这些方法允许客户端(欣赏器或播放器)按需请求并接收音频和视频的部分内容,而不是一次性加载整个文件。
  要在后端处理包罗 Range 头的请求,起首必要理解 Range 请求头是如何工作的。客户端通过 Range 请求头向服务器指定请求的字节范围。服务器根据 Range 请求返回相应的数据片段,通常用于视频、音频或大文件的流式传输。
1. Range 请求头的工作原理

客户端请求某个文件的部分内容时,会在 HTTP 请求头中包罗 Range,比方:
  1. Range: bytes=0-1023
复制代码
表示客户端请求文件的第 0 字节到第 1023 字节(共 1024 字节)。
如果客户端想请求多个范围(比方文件的两个不连续部分),则可以使用如下格式:
  1. Range: bytes=0-1023
  2. , 2048-3071
复制代码
2. 后端处理 Range 请求头

在 C# 中,后端必要从请求头中获取 Range 的信息,并且根据该信息返回对应的字节范围。通常可以通过 HttpRequest.Headers 来获取请求头中的 Range。
示例代码(ASP.NET Core):

  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.AspNetCore.Http;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net.Http.Headers;
  6. [Route("api/[controller]")]
  7. public class MediaController : ControllerBase
  8. {
  9.     [HttpGet("audio")]
  10.     public IActionResult GetAudio(string filename)
  11.     {
  12.         var fileInfo = new FileInfo(filename);
  13.         if (!fileInfo.Exists)
  14.         {
  15.             return NotFound();
  16.         }
  17.         var fileLength = fileInfo.Length;
  18.         var rangeHeader = Request.Headers["Range"].ToString();
  19.         if (string.IsNullOrEmpty(rangeHeader))
  20.         {
  21.             return BadRequest("Invalid Range header.");
  22.         }
  23.         // 解析 Range 请求头
  24.         var rangeMatch = System.Text.RegularExpressions.Regex.Match(rangeHeader, @"bytes=(\d+)-(\d+)?");
  25.         if (!rangeMatch.Success)
  26.         {
  27.             return BadRequest("Invalid Range header.");
  28.         }
  29.         var start = long.Parse(rangeMatch.Groups[1].Value);
  30.         var end = rangeMatch.Groups[2].Success ? long.Parse(rangeMatch.Groups[2].Value) : fileLength - 1;
  31.         // 确保范围合法
  32.         if (start < 0 || end >= fileLength || start > end)
  33.         {
  34.             return BadRequest("Invalid range.");
  35.         }
  36.         // 读取文件的指定范围
  37.         var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
  38.         var contentRange = new RangeHeaderValue(start, end);
  39.         var contentLength = end - start + 1;
  40.         // 设置响应头
  41.         Response.Headers.Add("Content-Range", $"bytes {start}-{end}/{fileLength}");
  42.         Response.Headers.Add("Accept-Ranges", "bytes");
  43.         Response.StatusCode = StatusCodes.Status206PartialContent; // 206 Partial Content
  44.         fileStream.Seek(start, SeekOrigin.Begin);
  45.         return File(fileStream, "audio/mpeg", enableRangeProcessing: true);
  46.     }
  47. }
复制代码
解释:

3. 前端使用 <audio> 标签播放音频

在前端使用 <audio> 标签时,欣赏器会自动发出 Range 请求,只要服务器支持 Range 请求,并且文件能够分段提供。你不必要特殊设置客户端来处理 Range,欣赏器会本身处理。
示例:基础 <audio> 标签用法

  1. <html>
  2.     <head>
  3.         <title>audio page</title>
  4.     </head>
  5.     <body>
  6.         <audio controls>
  7.             <source src="http://127.0.0.1:9099/api/media/audio?filename=1.mp3" type="audio/mp3">
  8.         </audio>
  9.     </body>
  10. </html>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4