没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
引文:
组里的小伙伴在修改视频播放相关的代码,修改之前的方案使用CDN转发,可以实现流式播放,修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放,整理下线索在这里。
一 解释:
在 Azure 中,通过 Blob 存储直接访问视频文件,通常是基于 HTTP 下载的方式,因此客户端会尝试下载整个文件后再播放。如果通过 CDN 转发,同一个文件能够实现边下边播,这是因为 CDN 支持了分段传输和范围请求(Range Request),这是流媒体播放的核心功能。
二 CDN支持流式播放的关键原理
-
HTTP Range Request
- Range Request 是 HTTP 协议中的一种功能,允许客户端请求文件的特定字节范围。
- 播放器会根据播放进度逐步请求文件的后续部分,而不是一次性请求整个文件。
- Azure Blob 本身支持 Range Request,但播放器需要明确支持这一特性。
-
CDN的优化
- 缓存优化
CDN 缓存视频文件,减少从源服务器(Azure Blob)的读取延迟。 - 分片预取
CDN 会根据播放器的请求预取后续视频片段,以确保播放过程的流畅性。 - 协议适配
CDN 可以将标准的文件传输协议(HTTP/HTTPS)转换为支持流媒体的格式,例如 HLS 或 DASH,从而更好地支持边下边播。
- 缓存优化
三 为什么 CDN 可以实现边下边播,而 Blob 不能
-
播放器行为差异
- 如果播放器不支持 Range Request,直接访问 Azure Blob 会尝试完整下载文件。
- CDN 转发会对客户端的请求进行优化,模拟流媒体的按需加载行为。
-
缓存与加速
- CDN 的缓存机制可以将文件分段处理,让边下边播更加高效。
- Blob 存储的访问速度相对受限于区域和网络延迟。
-
协议转换
- 使用 CDN 时,可以配置流媒体协议(如 HLS 或 DASH),使视频文件适配播放器的流式播放需求。
四 如何优化 Azure Blob 支持边下边播
如果希望直接通过 Azure Blob 存储实现边下边播,可以考虑以下方法:
1. 确保播放器支持 Range Request
- 现代浏览器中的 HTML5 播放器和一些第三方播放器(如 Video.js)通常都支持 Range Request。
- 测试播放器的功能,确保它能够根据文件的特定范围发起请求。
2. 通过转码工具创建流媒体文件
- 将视频文件转换为支持分段播放的格式(如 HLS 或 DASH)。
- 可以使用工具如 FFmpeg:
ffmpeg -i input.mp4 -hls_time 10 -hls_playlist_type vod -hls_segment_filename "segment_%03d.ts" output.m3u8
- 生成的
.m3u8
文件和分段.ts
文件可以直接存储在 Blob 中。
3. 配置 Azure CDN
- 为 Blob 存储配置 Azure CDN 加速,将视频文件通过 CDN 分发。
- 在 CDN 配置中启用 Range Request 和流媒体优化功能。
4. 使用 Azure Media Services
- Azure Media Services 提供了完整的流媒体解决方案,包括 HLS 和 DASH 格式支持。
- 步骤:
- 将视频文件上传到 Azure Blob。
- 使用 Azure Media Services 进行编码和动态打包。
- 通过 Media Services 提供的流式播放 URL 播放视频。
五 对比:Blob 存储 vs. CDN 的使用场景
功能 | Azure Blob 存储 | CDN 转发 |
---|---|---|
下载完整文件 | 支持 | 支持 |
Range Request | 依赖播放器支持 | 默认优化 |
边下边播 | 需要配置播放器和协议支持 | 原生支持(适合流媒体) |
性能 | 取决于 Blob 的区域和网络 | 提供全球加速和低延迟 |
成本 | 较低 | CDN 可能增加流量成本 |
六 推荐方案
如果你的视频需要频繁流式播放,建议通过以下方法改进:
-
配置 Azure CDN
- 简单易用,无需修改现有视频文件,适合常规边下边播需求。
-
使用 HLS/DASH 格式
- 适合需要更高播放性能和自适应比特率的场景,推荐结合 Azure Media Services 使用。
-
结合播放器优化
- 确保播放器对 Range Request 和流媒体协议的支持。
七 补充视频流式播放的一些技术概念
视频流式播放(Streaming Media)技术是一项复杂且广泛的技术领域,涉及编码、传输协议、播放协议、网络优化、内容分发等多个方面。以下是详细的技术知识和核心概念。
1. 视频流式播放的基本概念
-
流式播放(Streaming)
视频或音频文件通过网络分段传输到用户端,用户可以边下载边播放,无需等待整个文件下载完成。 -
实时流(Live Streaming)
实时传输音视频内容,常用于直播场景。 -
点播流(Video-on-Demand, VOD)
用户按需播放存储在服务器上的预录制内容。
2. 流式播放的工作流程
-
视频捕获与处理
- 使用摄像头、麦克风等设备录制视频或音频。
- 将内容转码为适合流式播放的格式(如 MP4、HLS、DASH)。
-
视频编码
- 使用编码器(如 H.264、H.265、VP9、AV1)对视频进行压缩,减少带宽占用。
- 常见的音频编码格式包括 AAC、MP3。
-
分片与打包
- 将视频按时间切分为小段(如 HLS 中的
.ts
文件或 DASH 中的.m4s
文件)。 - 生成播放清单文件(如
.m3u8
或.mpd
)。
- 将视频按时间切分为小段(如 HLS 中的
-
分发与传输
- 使用流媒体服务器(如 Wowza、Nginx RTMP 模块)或 CDN 分发内容。
- 客户端通过协议请求数据。
-
客户端解码与播放
- 客户端播放器接收视频片段并进行解码,按时间顺序播放,客户端需要支持流媒体解码,比如 HTML5 视频播放器、Flash 播放器或专有播放器(如 VLC、QuickTime)。
3. 核心技术组件
(1)编码与格式
- 编码(Codec)
视频和音频内容的压缩标准:- 视频:H.264、H.265、VP9、AV1。
- 音频:AAC、MP3、Opus。
- 容器格式
用于存储编码后的音视频数据:- 常见格式:MP4、MKV、WebM、TS。
(2)流媒体协议
-
HLS (HTTP Live Streaming)
- Apple 开发,基于 HTTP,兼容性强。
- 优点:支持自适应比特率(ABR)、简单实现。
- 缺点:延迟较高(通常 6-30 秒)。
-
DASH (Dynamic Adaptive Streaming over HTTP)
- 开放标准,类似 HLS。
- 优点:跨平台支持、高度灵活。
- 缺点:实现相对复杂。
-
RTMP (Real-Time Messaging Protocol)
- 传统直播协议,低延迟。
- 缺点:逐渐被 HLS 和 WebRTC 取代。
-
WebRTC
- 专为实时通信设计,支持超低延迟。
- 应用场景:视频会议、实时互动直播。
-
RTSP (Real-Time Streaming Protocol)
- 常用于监控视频,主要适配 IP 摄像头。
(3)分发与优化
-
内容分发网络(CDN)
- 提供全球范围内的内容缓存和分发,降低延迟,提高可靠性。
- 常见服务商:Cloudflare、Akamai、Azure CDN。
-
自适应比特率(ABR)
- 根据用户的网络带宽动态调整视频质量,保证流畅播放。
-
缓存与预取
- 缓存:将常用内容存储在离用户较近的服务器上,客户端会在播放视频时同时缓冲后续数据,以确保播放的连续性,即使网络连接有短暂的波动也能平滑播放。
- 预取:提前加载用户可能请求的视频片段。
4. 视频流式播放的优化技术
(1)低延迟优化
- 使用低延迟 HLS(LL-HLS)或 DASH(LL-DASH)。
- 减少片段长度(通常从 10 秒减少到 2 秒)。
- 使用 WebRTC 或 RTMP 替代传统协议。
(2)编码优化
- 调整编码参数(如分辨率、比特率)以适配网络条件。
- 使用高效编码格式(如 H.265、AV1)。
(3)缓冲管理
- 增大播放器缓冲区以应对网络抖动。
- 平衡缓冲区大小和延迟。
(4)QoS(服务质量)监控
- 监控用户端的播放体验(卡顿率、起播时间)。
- 实时调整传输策略。
5. 视频流式播放的应用场景
-
在线视频
- 平台:YouTube、Netflix。
- 技术:HLS、DASH。
-
直播
- 平台:Twitch、抖音直播。
- 技术:RTMP、WebRTC。
-
远程教育
- 平台:Coursera、edX。
- 技术:点播 + 直播。
-
视频会议
- 平台:Zoom、Microsoft Teams。
- 技术:WebRTC。
-
监控系统
- 技术:RTSP。
6. 视频流式播放的挑战
-
网络延迟
- 挑战:高延迟会影响实时交互体验。
- 解决方案:使用低延迟协议(如 WebRTC)。
-
网络带宽限制
- 挑战:用户网络差异导致播放不流畅。
- 解决方案:自适应比特率(ABR)。
-
内容安全
- 挑战:防止盗链和未授权访问。
- 解决方案:使用 DRM(数字版权管理)和 URL 签名。
-
多设备兼容
- 挑战:不同设备对协议和编码的支持差异。
- 解决方案:提供多种编码版本和播放协议。
7. 技术栈与工具
-
视频编码与处理
- FFmpeg:开源工具,用于转码、分片。
- HandBrake:视频转换和压缩。
-
流媒体服务器
- Nginx + RTMP 模块。
- Wowza Streaming Engine。
- AWS Elemental Media Services。
-
播放器
- Video.js:开源 HTML5 播放器。
- Shaka Player:支持 HLS 和 DASH。
- ExoPlayer:Android 原生播放器。
-
调试工具
- Chrome DevTools:网络请求分析。
- Wireshark:网络协议分析。
相关文章:
没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
引文: 组里的小伙伴在修改视频播放相关的代码,修改之前的方案使用CDN转发,可以实现流式播放,修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放,整理下线索在这…...

回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测
回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测 目录 回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进的机器学习方法,用于处理…...
开发人员学习书籍推荐(C#、Python方向)
作为一名开发人员,持续学习和提升自己的技术水平是至关重要的。如今,技术不断更新换代,新的开发框架、语言和工具层出不穷。对于刚入行的开发者或希望深入某一领域的工程师来说,选对书籍是学习的捷径之一。本篇文章将推荐一些经典…...

Springboot + vue 小区物业管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...

基于深度学习的视觉检测小项目(十二) 使用线条边框和渐变颜色美化界面
到目前为止,已经建立起了基本的项目架构,样式表体系也初步具备,但是与成品的界面相比,还是差点什么。 我的界面效果图: 优秀demo的界面截图: 是的,我的界面太“平” 了,没有立体感&…...

基于OQuPy的量子编程实例探究:理论、实践与展望
基于OQuPy的量子编程探究:理论、分析与实践 一、引言 1.1 研究背景与意义 近年来,量子计算作为一种革命性的计算范式,在科学界与产业界引发了广泛关注。它依托量子力学原理,运用量子比特(qubit)进行信息处理,与传统计算相比,具备并行处理、指数级加速等显著优势,为解…...

【数据库】二、关系数据库
文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域:一组具有相同数据类型的值的集合。 笛卡尔积:所有域(域可相同)中所有取值的组合 例如:D1{1,2,3},D2{A,b}&…...

C#类型转换
C#是静态类型的语言,变量一旦声明就无法重新声明或者存储其他类型的数据,除非进行类型转换。本章的主要任务就是学习类型转换的知识。类型转换有显式的,也有隐式的。所谓显式,就是我们必须明确地告知编译器,我们要把变…...

【Vue】Vue组件--上
目录 一、组件基础 二、组件的嵌套关系 1. 基础架构 2. 嵌套 三、组件注册方式 1. 局部注册: 2. 全局注册: 四、组件传递数据 1. 基础架构 2. 传递多值 3. 动态传递数据 五、组件传递多种数据类型 1. Number 2. Array 3. Object 六、组…...

21、Transformer Masked loss原理精讲及其PyTorch逐行实现
1. Transformer结构图 2. python import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2seq_length 3vocab_size 4logits torch.randn(batch…...

构建高性能网络服务:从 Socket 原理到 Netty 应用实践
1. 引言 在 Java 网络编程中,Socket 是实现网络通信的基础(可以查看我的上一篇博客)。它封装了 TCP/IP 协议栈,提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上,进一步封装的高性能、异步事件驱动的…...
Spring Boot教程之五十六:用 Apache Kafka 消费 JSON 消息
Spring Boot | 如何使用 Apache Kafka 消费 JSON 消息 Apache Kafka 是一个流处理系统,可让您在进程、应用程序和服务器之间发送消息。在本文中,我们将了解如何使用 Apache Kafka 在 Spring Boot 应用程序的控制台上发布 JSON 消息。 为了了解如何创建 …...

Elasticsearch ES|QL 地理空间索引加入纽约犯罪地图
可以根据地理空间数据连接两个索引。在本教程中,我将向你展示如何通过混合邻里多边形和 GPS 犯罪事件坐标来创建纽约市的犯罪地图。 安装 如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话,请参考如下的链接来进行安装。 如何在 Linux࿰…...
csp-j知识点:联合(Union)的基本概念
一、联合(Union)的基本概念 联合是C/C语言中一种特殊的数据结构,它的主要特点是所有成员共享同一块内存空间。这意味着在任何给定时刻,联合中只有一个成员是有效的,因为它们都占用相同的物理内存位置。联合的大小取决…...

docker-compose 方式安装部署confluence
一、confluence简介 Confluence是一款由澳大利亚软件公司Atlassian开发的企业协作工具。它是一个基于web的团队协作平台,用于帮助团队成员共享和协同工作的知识、文档、想法和项目。 Confluence提供了一个集中管理和共享文档、知识库和项目信息的平台。团队成员可…...

深入理解计算机系统阅读笔记-第十二章
第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型,一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如…...

网络原理(九):数据链路层 - 以太网协议 应用层 - DNS 协议
目录 1. 数据链路层 1.1 以太网协议 1.1.1 以太网帧格式 1.2 mac 地址 1.2.1 IP 地址和 mac 地址的区别 1.3 帧中的类型字段 1.3.1 MTU - 最长载荷长度 1.3.2 ARP 协议 2. DNS 协议 1. 数据链路层 数据链路层, 是一个底层的层次, 主要用于交换机开发, 对于 Java 开发…...

rtthread学习笔记系列(4/5/6/7/15/16)
文章目录 4. 杂项4.1 检查是否否是2的幂 5. 预编译命令void类型和rt_noreturn类型的区别 6.map文件分析7.汇编.s文件7.1 汇编指令7.1.1 BX7.1.2 LR链接寄存器7.1.4 []的作用7.1.4 简单的指令 7.2 MSR7.3 PRIMASK寄存器7.4.中断启用禁用7.3 HardFault_Handler 15 ARM指针寄存器1…...

【拒绝算法PUA】3065. 超过阈值的最少操作数 I
系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结: [温习C/C]0x04 刷…...
今日总结 2025-01-14
学习目标 掌握运用 VSCode 开发 uni - app 的配置流程。学会将配置完善的项目作为模板上传至 Git,实现复用。项目启动 创建项目:借助 Vue - Cli 方式创建项目,推荐从国内地址 https://gitee.com/dcloud/uni - preset - vue/repository/archiv…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...