首页 > 其他分享 >音视频文件提供流式传输之HTTP Range 请求

音视频文件提供流式传输之HTTP Range 请求

时间:2025-01-16 09:57:33浏览次数:1  
标签:文件 end 请求 音视频 start Range var HTTP

在 Web 开发中,正确返回音频和视频流给前端的方式是确保服务器端以流的形式发送媒体文件,而不是将整个文件加载到内存中,然后再传输。这种做法可以提高性能,避免内存溢出,尤其是在处理大文件时。
对于音频和视频流的处理,最常见的技术是 HTTP 流式传输(HTTP Streaming) Range 请求。这些方法允许客户端(浏览器或播放器)按需请求并接收音频和视频的部分内容,而不是一次性加载整个文件。

要在后端处理包含 Range 头的请求,首先需要理解 Range 请求头是如何工作的。客户端通过 Range 请求头向服务器指定请求的字节范围。服务器根据 Range 请求返回相应的数据片段,通常用于视频、音频或大文件的流式传输。

1. Range 请求头的工作原理

客户端请求某个文件的部分内容时,会在 HTTP 请求头中包含 Range,例如:

Range: bytes=0-1023

表示客户端请求文件的第 0 字节到第 1023 字节(共 1024 字节)。

如果客户端想请求多个范围(例如文件的两个不连续部分),则可以使用如下格式:

Range: bytes=0-1023, 2048-3071

2. 后端处理 Range 请求头

在 C# 中,后端需要从请求头中获取 Range 的信息,并且根据该信息返回对应的字节范围。通常可以通过 HttpRequest.Headers 来获取请求头中的 Range

示例代码(ASP.NET Core):

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;

[Route("api/[controller]")]
public class MediaController : ControllerBase
{ 
    [HttpGet("audio")]
    public IActionResult GetAudio(string filename)
    {
        var fileInfo = new FileInfo(filename);
        if (!fileInfo.Exists)
        {
            return NotFound();
        }

        var fileLength = fileInfo.Length;
        var rangeHeader = Request.Headers["Range"].ToString();

        if (string.IsNullOrEmpty(rangeHeader))
        {
            return BadRequest("Invalid Range header.");
        }

        // 解析 Range 请求头
        var rangeMatch = System.Text.RegularExpressions.Regex.Match(rangeHeader, @"bytes=(\d+)-(\d+)?");
        if (!rangeMatch.Success)
        {
            return BadRequest("Invalid Range header.");
        }

        var start = long.Parse(rangeMatch.Groups[1].Value);
        var end = rangeMatch.Groups[2].Success ? long.Parse(rangeMatch.Groups[2].Value) : fileLength - 1;

        // 确保范围合法
        if (start < 0 || end >= fileLength || start > end)
        {
            return BadRequest("Invalid range.");
        }

        // 读取文件的指定范围
        var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
        var contentRange = new RangeHeaderValue(start, end);
        var contentLength = end - start + 1;

        // 设置响应头
        Response.Headers.Add("Content-Range", $"bytes {start}-{end}/{fileLength}");
        Response.Headers.Add("Accept-Ranges", "bytes");
        Response.StatusCode = StatusCodes.Status206PartialContent; // 206 Partial Content

        fileStream.Seek(start, SeekOrigin.Begin);

        return File(fileStream, "audio/mpeg", enableRangeProcessing: true);
    }
}

解释:

  1. Range 请求头解析

    • Request.Headers["Range"] 获取 Range 请求头的内容。
    • 使用正则表达式 @"bytes=(\d+)-(\d+)?" 来提取请求的开始和结束字节。
    • 如果 end 字段缺失,则将 end 设置为文件的最后一个字节。
  2. 合法性检查

    • 确保 startend 在合法范围内,即它们不能超出文件的总长度,也不能发生 start > end 的情况。
  3. 文件流处理

    • 使用 FileStream 打开文件,并设置 Seek 方法从指定的字节位置开始读取文件内容。
    • 返回部分文件内容时,设置响应头 Content-Range,告知客户端返回的数据范围。
  4. 返回部分内容

    • 设置响应状态码为 206 Partial Content,表示这是一个部分内容的响应。
    • 使用 File 方法返回文件流,并通过 enableRangeProcessing: true 告诉 ASP.NET Core 进行范围处理。

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

在前端使用 <audio> 标签时,浏览器会自动发出 Range 请求,只要服务器支持 Range 请求,并且文件能够分段提供。你不需要特别配置客户端来处理 Range,浏览器会自己处理。

示例:基础 <audio> 标签用法

<html>
    <head>
        <title>audio page</title>
    </head>
    <body>
        <audio controls>
            <source src="http://127.0.0.1:9099/api/media/audio?filename=1.mp3" type="audio/mp3">
        </audio>
    </body>
</html>

标签:文件,end,请求,音视频,start,Range,var,HTTP
From: https://www.cnblogs.com/dx5800/p/18623877

相关文章

  • 如何下载并安装HTTPS证书以保障网站安全
    问题描述: 购买了HTTPS证书后,不知道如何下载和安装到服务器上。希望获得详细的步骤指导,确保网站能够顺利启用HTTPS协议。解决方案:|步骤|描述||---|------||1.登录管理后台|使用管理员账号登录域名提供商或云服务商提供的管理后台。进入“业务管理”模块,选择“安......
  • HTTP调用
    若需在不依赖开发者工具场景如自身业务工程流水线上进行小程序项目上传、预览,则推荐使用miniprogram-ci开发者工具提供了命令行与HTTP服务两种接口供外部调用,开发者可以通过命令行或HTTP请求指示工具进行登录、预览、上传等操作。HTTPV2升级说明:自1.02.202003092开始,C......
  • 【Niquests】最简单和先进的Python HTTP 客户端,完美替换Requests
    什么是NiquestsNiquests是一个简单而优雅的HTTP客户端,简单说它是Requests的直接替代品。因为多年来Requests功能一直处于停滞不前的状态,由于不前进的状态并且没有发展,这阻止了数百万开发人员使用更高级的功能,所以就有了Niquests,Niquests是唯一能够自动提供HTTP/1.1......
  • springboot 项目配置https
    当你的前端网页添加了https后,那么由于…前端调用后端的接口,同样的也需要配置https。下面以宝塔为例,如何实现,请看下面讲解:1.准备好SSL证书application.yml源文件:spring:redis:host:60.204.232.18port:6379database:3cloud:nacos:......
  • TCP 与 HTTP keepalive 关系
    1.概念介绍   TCPkeepalive     TCPkeepalive是一种TCP协议层面的机制。它的主要作用是在TCP连接处于空闲状态时,定期发送探测包来检测连接的对端是否还存活。例如,在一个长时间没有数据传输的TCP连接中,服务器端可能会按照配置好的时间间隔(如每隔7200秒)发送一个TCP......
  • CS61B srping 2018 proj1Gold-Autograding https://sp18.datastructur.es/ 我放弃了
    介绍和GettingtheSkeletonFiles想办法找到下面四个文件这个proj要编写一个autoGrader,提供如下文件:StudentArrayDeque.java:AbuggyimplementationofArrayDeque.有错误的ArrayDequeArrayDequeSolution.java:AcorrectimplementationofArrayDeque.正确的ArrayDequ......
  • 如何解决 HTTP 500 内部服务器错误?
    HTTP500内部服务器错误通常是由于服务器端的代码问题或配置错误引起的。为了更好地诊断和解决问题,首先需要获取详细的错误信息。以下是解决HTTP500错误的步骤:1.启用详细错误信息服务器通常会屏蔽详细的错误信息,以防止泄露敏感数据。可以通过修改配置文件来显示详细的错误......
  • HTTP协议
    HTTP协议是应用层的一个重要协议。1.应答模式应答模式分为许多种,由一问一答、一问多答、多问一答、多问多答。HTTP属于一问一答,典型的场景有浏览器打开网页、手机app加载数据;一问多答典型场景有下载大文件;多问一答典型场景有上传大文件;多问多答典型场景有桌面远程控制软......
  • HTTP 与 HTTPS:从明文传输到安全加密的全面解析
    下面这篇博客旨在全方位解读HTTP与HTTPS的来龙去脉、核心原理以及在现代网络中的广泛应用。为了帮助读者真正理解这两种协议如何支撑互联网生态,本篇文章不仅会介绍HTTP的发展历程,也会深入浅出地阐述HTTPS如何在安全层面保护用户数据,并展望未来网络的演化趋势。希望这篇......
  • 网页请求助手 WebRequestHelper 【支持XMLHTTP、WinhttpRequest】
    WebRequestHelper是我用VB6开发的网页请求辅助工具,可以在软件界面中设置请求方式、请求头,然后自动生成VB代码。下面假设要请求 http://www.dpxq.com/hldcg/search/list.asp?owner=ryueifu&page=4这个网址,预先在浏览器中使用开发工具获取到如下:GET/hldcg/search/DhtmlXQ_www_d......