没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放

引文:

组里的小伙伴在修改视频播放相关的代码,修改之前的方案使用CDN转发,可以实现流式播放,修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放,整理下线索在这里。

一 解释:

在 Azure 中,通过 Blob 存储直接访问视频文件,通常是基于 HTTP 下载的方式,因此客户端会尝试下载整个文件后再播放。如果通过 CDN 转发,同一个文件能够实现边下边播,这是因为 CDN 支持了分段传输范围请求(Range Request),这是流媒体播放的核心功能。


二 CDN支持流式播放的关键原理

  1. HTTP Range Request

    • Range Request 是 HTTP 协议中的一种功能,允许客户端请求文件的特定字节范围。
    • 播放器会根据播放进度逐步请求文件的后续部分,而不是一次性请求整个文件。
    • Azure Blob 本身支持 Range Request,但播放器需要明确支持这一特性。
  2. CDN的优化

    • 缓存优化
      CDN 缓存视频文件,减少从源服务器(Azure Blob)的读取延迟。
    • 分片预取
      CDN 会根据播放器的请求预取后续视频片段,以确保播放过程的流畅性。
    • 协议适配
      CDN 可以将标准的文件传输协议(HTTP/HTTPS)转换为支持流媒体的格式,例如 HLS 或 DASH,从而更好地支持边下边播。

三 为什么 CDN 可以实现边下边播,而 Blob 不能

  1. 播放器行为差异

    • 如果播放器不支持 Range Request,直接访问 Azure Blob 会尝试完整下载文件。
    • CDN 转发会对客户端的请求进行优化,模拟流媒体的按需加载行为。
  2. 缓存与加速

    • CDN 的缓存机制可以将文件分段处理,让边下边播更加高效。
    • Blob 存储的访问速度相对受限于区域和网络延迟。
  3. 协议转换

    • 使用 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 格式支持。
  • 步骤:
    1. 将视频文件上传到 Azure Blob。
    2. 使用 Azure Media Services 进行编码和动态打包。
    3. 通过 Media Services 提供的流式播放 URL 播放视频。

五 对比:Blob 存储 vs. CDN 的使用场景

功能Azure Blob 存储CDN 转发
下载完整文件支持支持
Range Request依赖播放器支持默认优化
边下边播需要配置播放器和协议支持原生支持(适合流媒体)
性能取决于 Blob 的区域和网络提供全球加速和低延迟
成本较低CDN 可能增加流量成本

六 推荐方案

如果你的视频需要频繁流式播放,建议通过以下方法改进:

  1. 配置 Azure CDN

    • 简单易用,无需修改现有视频文件,适合常规边下边播需求。
  2. 使用 HLS/DASH 格式

    • 适合需要更高播放性能和自适应比特率的场景,推荐结合 Azure Media Services 使用。
  3. 结合播放器优化

    • 确保播放器对 Range Request 和流媒体协议的支持。


七 补充视频流式播放的一些技术概念

视频流式播放(Streaming Media)技术是一项复杂且广泛的技术领域,涉及编码、传输协议、播放协议、网络优化、内容分发等多个方面。以下是详细的技术知识和核心概念。


1. 视频流式播放的基本概念

  • 流式播放(Streaming)
    视频或音频文件通过网络分段传输到用户端,用户可以边下载边播放,无需等待整个文件下载完成。

  • 实时流(Live Streaming)
    实时传输音视频内容,常用于直播场景。

  • 点播流(Video-on-Demand, VOD)
    用户按需播放存储在服务器上的预录制内容。


2. 流式播放的工作流程

  1. 视频捕获与处理

    • 使用摄像头、麦克风等设备录制视频或音频。
    • 将内容转码为适合流式播放的格式(如 MP4、HLS、DASH)。
  2. 视频编码

    • 使用编码器(如 H.264、H.265、VP9、AV1)对视频进行压缩,减少带宽占用。
    • 常见的音频编码格式包括 AAC、MP3。
  3. 分片与打包

    • 将视频按时间切分为小段(如 HLS 中的 .ts 文件或 DASH 中的 .m4s 文件)。
    • 生成播放清单文件(如 .m3u8.mpd)。
  4. 分发与传输

    • 使用流媒体服务器(如 Wowza、Nginx RTMP 模块)或 CDN 分发内容。
    • 客户端通过协议请求数据。
  5. 客户端解码与播放

    • 客户端播放器接收视频片段并进行解码,按时间顺序播放,客户端需要支持流媒体解码,比如 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. 视频流式播放的应用场景

  1. 在线视频

    • 平台:YouTube、Netflix。
    • 技术:HLS、DASH。
  2. 直播

    • 平台:Twitch、抖音直播。
    • 技术:RTMP、WebRTC。
  3. 远程教育

    • 平台:Coursera、edX。
    • 技术:点播 + 直播。
  4. 视频会议

    • 平台:Zoom、Microsoft Teams。
    • 技术:WebRTC。
  5. 监控系统

    • 技术:RTSP。

6. 视频流式播放的挑战

  1. 网络延迟

    • 挑战:高延迟会影响实时交互体验。
    • 解决方案:使用低延迟协议(如 WebRTC)。
  2. 网络带宽限制

    • 挑战:用户网络差异导致播放不流畅。
    • 解决方案:自适应比特率(ABR)。
  3. 内容安全

    • 挑战:防止盗链和未授权访问。
    • 解决方案:使用 DRM(数字版权管理)和 URL 签名。
  4. 多设备兼容

    • 挑战:不同设备对协议和编码的支持差异。
    • 解决方案:提供多种编码版本和播放协议。

7. 技术栈与工具

  1. 视频编码与处理

    • FFmpeg:开源工具,用于转码、分片。
    • HandBrake:视频转换和压缩。
  2. 流媒体服务器

    • Nginx + RTMP 模块。
    • Wowza Streaming Engine。
    • AWS Elemental Media Services。
  3. 播放器

    • Video.js:开源 HTML5 播放器。
    • Shaka Player:支持 HLS 和 DASH。
    • ExoPlayer:Android 原生播放器。
  4. 调试工具

    • Chrome DevTools:网络请求分析。
    • Wireshark:网络协议分析。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/953808.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Public Key Retrieval is not allowed 解决方法

如图:我的报错是Public Key Retrieval is not allowed,我的前后端都能正常加载,但是在请求数据库时就会报错如下: 解决办法: 在 application.yaml 中的数据库设置地方加上allowPublicKeyRetrievaltrue,然后…

unity学习17:unity里的旋转学习,欧拉角,四元数等

目录 1 三维空间里的旋转与欧拉角,四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…

从 Conda 到 Pip-tools:Python 依赖管理全景探索20250113

从 Conda 到 Pip-tools:Python 依赖管理全景探索 引言 在 Python 开发中,依赖管理是一个"常见但复杂"的问题:一次简单的版本冲突可能让团队调试数小时;一次不受控的依赖升级可能让生产环境瘫痪。随着项目规模的增加和…

【容器逃逸实践】挂载/dev方法

0、前置知识 怎么在容器里面执行命令, 有几种方法 # 不进入容器,创建并启动一个新的容器 $ docker run -itd --name ubuntu-test ubuntu /bin/bash # 进入容器,创建并启动一个新的容器 $ docker run -itd --name ubuntu-test ubuntu /bin…

【Linux】进程结束和进程等待

进程的结束 退出码的认识 在我们学习C/C的时候我们通常在进行写main函数时,main函数主体写完后通常会进行写一条语句 " return 0 " ,这里的这条语句到底是什么意思呢?? 我们知道当在主函数中调用其他函数或者在其他函…

Apache Hop从入门到精通 第二课 Apache Hop 核心概念/术语

1、apache hop核心概念思维导图 虽然apache hop是kettle的一个分支,但是它的概念和kettle还是有一些区别的,下图是我根据官方文档梳理的appache hop的核心概念思维导图。 2、Tools(工具) 1)Hop Conf Hop Conf 是一个…

28.找出字符串中第一个匹配项的下标【力扣】KMP前缀表 ≈ find() 函数、暴力解法

class Solution { public: //得到前缀表void getNext(int *next,string needle){int j0;for(int i1;i<needle.size();i){while(j>0 && needle[j]!needle[i]) jnext[j-1];//**j>0**>j0是出口if(needle[i]needle[j]) j;next[i]j;//若写入if中&#xff0c;则该…

uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?

前言 在开发微信小程序时&#xff0c;使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时&#xff0c;就遇到了两个非常令人头疼的问题&#xff1a; 层级穿透&#xff1a;由于 textarea 是原生组件&#xff0c;任何元素都无法遮盖住它。当其…

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用

在使用 PySide6 进行开发时&#xff0c;管理应用程序的资源&#xff08;如图标、图片、字体、样式表、音视频等&#xff09;是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc&#xff0c;它能够将资源文件&#xff08;.qrc&#xff09;编译成 Python 模块&#xff0c;然后…

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和&#xff08;Internet Checksum&#xff09;算法。通过阅读《RFC 1071》文档理解该算法的工作原理&#xff0c;并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文&#xff08;包括ICMP、TCP、UDP等&a…

【Rust自学】12.6. 使用TDD(测试驱动开发)开发库功能

12.6.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读取…

基于springboot+vue的洪涝灾害应急信息管理系统设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

SpringBoot + 事务钩子函数

一、案例背景 拿支付系统相关的业务来举例。在支付系统中&#xff0c;我们需要记录每个账户的资金流水&#xff08;记录用户A因为哪个操作扣了钱&#xff0c;因为哪个操作加了钱&#xff09;&#xff0c;这样我们才能对每个账户的账做到心中有数&#xff0c;对于支付系统而言&…

基于微信小程序的智能停车场管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

接上一主题,实现QtByteArray任意进制字符串转为十进制数

函数&#xff1a; /// <summary>/// n进制字符串转为十进制数&#xff0c;snDefine的长度最小为二进制数。/// 例子&#xff1a;/// _pn(_Math::strNToInt(_t("1010"), _t("01")));/// _pn(_Math::strNToInt(_t("-1010"), _t("0123…

小游戏前端地区获取

目前前端获取除了太平洋&#xff0c;没有其它的了。 //在JS中都是使用的UTF-8&#xff0c;然而requst请求后显示GBK却是乱码&#xff0c;对传入的GBK字符串&#xff0c;要用数据流接收&#xff0c;responseType: "arraybuffer" tt.request({url: "https://whoi…

sosadmin相关命令

sosadmin命令 以下是本人翻译的官方文档&#xff0c;如有不对&#xff0c;还请指出&#xff0c;引用请标明出处。 原本有个对应表可以跳转的&#xff0c;但是CSDN的这个[](#)跳转好像不太一样&#xff0c;必须得用html标签&#xff0c;就懒得改了。 sosadmin help 用法 sosadm…

人工智能提高安全性的8种方法

人工智能提高安全性的8种方法 人工智能&#xff08;AI&#xff09;通过增强威胁检测、简化响应和加强各个领域的防御&#xff0c;正在彻底改变网络安全。根据HPE的见解&#xff0c;以下是基于AI改善安全性的八种关键方式。 ​ ​ 高级威胁检测和实时监控&#xff1a; 人工智能…

Android SDK下载安装(图文详解)

安装完sdk&#xff0c;就可以直接使用adb命令了&#xff0c;我们做app自动化测试&#xff0c;也需要sdk环境的依赖。 1. 下载Android SDK 网盘下载地址&#xff1a;https://pan.quark.cn/s/8398e52cefc9 官网下载地址&#xff1a;https://www.androiddevtools.cn/ &#xff08;…

25/1/13 嵌入式笔记 继续学习Esp32

PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09; 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。 analogWrite函数:用于在微控制器&#xff08;如 Arduino&#xff09;上生成模拟信号。 …