当前位置: 首页 > news >正文

广州有哪些做网站的公司seo服务合同

广州有哪些做网站的公司,seo服务合同,网站备案 公安,有没有会计做兼职的网站HTTP Range 请求 一种通过指定文件字节范围加载部分数据的技术,广泛用于断点续传、流媒体播放、分布式文件系统的数据分片加载等场景。 请求格式-在请求头中使用 Range 字段指定所需的字节范围 Range: bytes0-1023// bytes0-1023:表示请求文件的第 0 …

HTTP Range 请求

一种通过指定文件字节范围加载部分数据的技术,广泛用于断点续传流媒体播放分布式文件系统的数据分片加载等场景。

请求格式-在请求头中使用 Range 字段指定所需的字节范围

Range: bytes=0-1023// bytes=0-1023:表示请求文件的第 0 到第 1023 字节。
// bytes=1024-:表示从第 1024 字节开始到文件末尾。
// bytes=-1024:表示请求最后 1024 字节。

服务器响应-服务器会返回 206 Partial Content 状态码,并包含 Content-Range 响应头

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/1234567// bytes 0-1023/1234567:表示当前返回的范围和文件的总大小(单位:字节)

前端实现文件分片加载

<!DOCTYPE html>
<html><head><meta charset="utf-8" />
</head><body><!--  创建一个带有控制条和静音属性的视频播放器 --><video id="video" controls muted></video><script>const video=document.querySelector('video'); // 获取页面中的 video 元素// 视频的 URL 可通过浏览器直接访问【检查视频路径正确无误】;服务器支持 HTTP Range 请求【在服务器配置中启用 Accept-Ranges: bytes 支持】,如果不支持,fetch 请求会失败const assetURL='xxxxxxx.mp4'; // 定义视频文件的 URLconst mimeCodec='video/mp4; codecs="avc1.64001F, mp4a.40.2"'; // 定义视频的 MIME 类型和编解码器if('MediaSource' in window&&MediaSource.isTypeSupported(mimeCodec)) { // 检查浏览器是否支持 MediaSource API 和指定的 MIME 类型const mediaSource=new MediaSource(); // 创建一个新的 MediaSource 对象video.src=URL.createObjectURL(mediaSource); // 将 MediaSource 对象绑定到 video 元素mediaSource.addEventListener('sourceopen',() => { // 监听 sourceopen 事件,表示 MediaSource 已经准备好const sourceBuffer=mediaSource.addSourceBuffer(mimeCodec); // 添加一个 SourceBuffer 来处理指定 MIME 类型的数据let loadedBytes=0; // 记录已加载的字节数const segmentSize=1024*1024; // 每段大小 1MB // 定义每次请求的分段大小为 1MBlet totalSize=0; // 在此处声明并初始化 totalSize // 初始化视频总大小为 0function fetchSegment (start) { // 定义一个函数用于按分段下载视频数据const end=start+segmentSize-1; // 计算当前分段的结束位置fetch(assetURL,{headers: {Range: `bytes=${start}-${end}`}, // 发送 HTTP 请求,指定请求的字节范围}).then(response => {if(response.ok) {// 提取总大小(仅在第一次加载时获取)if(!totalSize&&response.headers.get('Content-Range')) { // 如果还没有获取到总大小,则从响应头中提取const contentRange=response.headers.get('Content-Range');totalSize=parseInt(contentRange.split('/')[1],10); // 解析 Content-Range 头以获取总大小}return response.arrayBuffer(); // 将响应体转换为 ArrayBuffer 格式}throw new Error(`Failed to fetch segment: ${response.status}`); // 如果请求失败则抛出错误}).then(data => {sourceBuffer.appendBuffer(data); // 将下载的数据追加到 SourceBuffer 中loadedBytes+=data.byteLength; // 更新已加载的字节数sourceBuffer.addEventListener('updateend',() => { // 监听 updateend 事件,表示数据已经成功追加if(loadedBytes<totalSize) {fetchSegment(loadedBytes); // 如果还有未加载的数据,则继续加载下一个分段} else {mediaSource.endOfStream(); // 如果所有数据都已加载完毕,则结束流video.play(); // 开始播放视频}},{once: true}); // 确保该事件只触发一次}).catch(console.error); // 捕获并打印任何错误}fetchSegment(0); // 开始加载第一个片段 // 调用 fetchSegment 函数开始加载第一个分段});} else {console.error('Unsupported MIME type or codec: ',mimeCodec); // 如果不支持指定的 MIME 类型或编解码器,则输出错误信息}function sourceOpen (_) { // 定义 sourceOpen 回调函数const mediaSource=this; // 将 this 绑定到 mediaSource 变量const sourceBuffer=mediaSource.addSourceBuffer(mimeCodec); // 添加一个 SourceBuffer 来处理指定 MIME 类型的数据let loadedBytes=0; // 已加载的字节数 // 初始化已加载的字节数let totalSize=null; // 视频总大小 // 初始化视频总大小const segmentSize=4096; // 每段大小 (假设 4KB) // 定义每次请求的分段大小为 4KBlet isAppending=false; // 标记是否正在追加数据sourceBuffer.addEventListener('updateend',() => { // 监听 updateend 事件,表示数据已经成功追加isAppending=false; // 标记不再追加数据if(loadedBytes<totalSize) {const nextStart=loadedBytes; // 计算下一个分段的起始位置const nextEnd=Math.min(nextStart+segmentSize-1,totalSize-1); // 计算下一个分段的结束位置fetchAndAppend(nextStart,nextEnd); // 加载并追加下一个分段的数据} else {mediaSource.endOfStream(); // 如果所有数据都已加载完毕,则结束流video.play(); // 开始播放视频}});function fetchAndAppend (start,end) { // 定义一个函数用于按分段下载视频数据if(isAppending) return; // 避免重复加载 // 如果正在追加数据,则直接返回isAppending=true; // 标记正在追加数据fetch(assetURL,{headers: {Range: `bytes=${start}-${end}`}, // 发送 HTTP 请求,指定请求的字节范围}).then(response => {if(response.status===206) { // 如果服务器支持范围请求,则继续处理const contentRange=response.headers.get('Content-Range'); // 获取 Content-Range 响应头if(contentRange&&!totalSize) {// 解析 Content-Range: bytes start-end/totalconst match=contentRange.match(/\/(\d+)$/); // 使用正则表达式解析 Content-Range 头if(match) {totalSize=parseInt(match[1],10); // 解析并设置视频总大小}}return response.arrayBuffer(); // 将响应体转换为 ArrayBuffer 格式}throw new Error('Range request not supported'); // 如果服务器不支持范围请求,则抛出错误}).then(data => {sourceBuffer.appendBuffer(data); // 将下载的数据追加到 SourceBuffer 中loadedBytes+=data.byteLength; // 更新已加载的字节数}).catch(error => console.error('Fetch error:',error)); // 捕获并打印任何错误}// 初始加载第一个片段fetchAndAppend(0,segmentSize-1); // 调用 fetchAndAppend 函数开始加载第一个分段}</script>
</body></html>

总结

  1. 客户端通过 Range 请求加载指定字节范围。
  2. 服务器返回 206 Partial Content 响应。
  3. 使用 MediaSource 动态拼接分段数据,实现无缝播放

文章转载自:
http://goldwasser.xsfg.cn
http://paddyfield.xsfg.cn
http://tweeze.xsfg.cn
http://sadomasochism.xsfg.cn
http://garrulity.xsfg.cn
http://transshape.xsfg.cn
http://unmortgaged.xsfg.cn
http://herniotomy.xsfg.cn
http://appellant.xsfg.cn
http://repetitionary.xsfg.cn
http://tatouay.xsfg.cn
http://capstone.xsfg.cn
http://salmonellosis.xsfg.cn
http://catercornered.xsfg.cn
http://drupe.xsfg.cn
http://panmixis.xsfg.cn
http://solarimeter.xsfg.cn
http://ratepaying.xsfg.cn
http://spinozism.xsfg.cn
http://tumorous.xsfg.cn
http://cheddite.xsfg.cn
http://regentship.xsfg.cn
http://anhydremia.xsfg.cn
http://shulamite.xsfg.cn
http://bedsheet.xsfg.cn
http://injun.xsfg.cn
http://aphony.xsfg.cn
http://monometer.xsfg.cn
http://sclera.xsfg.cn
http://fontainebleau.xsfg.cn
http://diadochokinesia.xsfg.cn
http://nebelwerfer.xsfg.cn
http://myogram.xsfg.cn
http://sinkful.xsfg.cn
http://mohawk.xsfg.cn
http://staffer.xsfg.cn
http://clairvoyance.xsfg.cn
http://circumambient.xsfg.cn
http://talkatively.xsfg.cn
http://pentalpha.xsfg.cn
http://prudently.xsfg.cn
http://cosmoplastic.xsfg.cn
http://permian.xsfg.cn
http://condole.xsfg.cn
http://gurge.xsfg.cn
http://sportswriting.xsfg.cn
http://godsend.xsfg.cn
http://downcome.xsfg.cn
http://antechoir.xsfg.cn
http://magnetisation.xsfg.cn
http://magda.xsfg.cn
http://antenatal.xsfg.cn
http://crocus.xsfg.cn
http://skivvy.xsfg.cn
http://seminude.xsfg.cn
http://thessaly.xsfg.cn
http://ephemerality.xsfg.cn
http://protostellar.xsfg.cn
http://enzygotic.xsfg.cn
http://nfl.xsfg.cn
http://lambkill.xsfg.cn
http://nonsexual.xsfg.cn
http://upcurl.xsfg.cn
http://visualizer.xsfg.cn
http://whitey.xsfg.cn
http://crossways.xsfg.cn
http://knapweed.xsfg.cn
http://tormenting.xsfg.cn
http://kowloon.xsfg.cn
http://aesthetical.xsfg.cn
http://strix.xsfg.cn
http://banxring.xsfg.cn
http://backmarker.xsfg.cn
http://nilpotent.xsfg.cn
http://shoo.xsfg.cn
http://glutaraldehyde.xsfg.cn
http://thioester.xsfg.cn
http://surroundings.xsfg.cn
http://czarevitch.xsfg.cn
http://future.xsfg.cn
http://chare.xsfg.cn
http://sonarman.xsfg.cn
http://buddhism.xsfg.cn
http://editioprinceps.xsfg.cn
http://acetonaemia.xsfg.cn
http://daggle.xsfg.cn
http://fungi.xsfg.cn
http://bacillicide.xsfg.cn
http://surfactant.xsfg.cn
http://mag.xsfg.cn
http://gaggy.xsfg.cn
http://subcuticular.xsfg.cn
http://cancered.xsfg.cn
http://lak.xsfg.cn
http://iamap.xsfg.cn
http://piraeus.xsfg.cn
http://mckenney.xsfg.cn
http://haulabout.xsfg.cn
http://metamerism.xsfg.cn
http://unseasoned.xsfg.cn
http://www.hrbkazy.com/news/72151.html

相关文章:

  • 如何建设自己的企业网站免费个人推广引流平台
  • 东莞app开发定制潍坊seo外包平台
  • 爱给网官网免费素材百度快速seo软件
  • python做网站验证码百度快速优化推广
  • 做平面的素材网站如何建立自己的网站
  • 天津建设网工程信息网seo云优化软件
  • 怎样用ps做企业网站西安发布最新通知
  • 聊城网站建设包括哪些微信怎么推广找客源
  • react怎么做pc网站寻找客户的渠道和方法
  • 最好科技上海网站建设谷歌google地图
  • 行业网站建设收费明细百度推广客户端下载安装
  • 南庄建网站服务中国品牌策划公司排名
  • 河源建设局网站新手怎么推广自己的店铺
  • 那个网站可免费做推广云优化seo
  • 黑群晖 wordpress德阳seo
  • 网站建设小技巧seo视频教程
  • jquery 个人网站游戏app拉新平台
  • 北京网络维护公司张家港seo建站
  • 做商城外贸网站怎样开网站
  • 政务网站建设工作计划crm管理系统
  • behance设计网站 教程2023年新闻热点事件
  • 用表格做网站seo排名快速上升
  • 接网站开发的公司电话百度搜索引擎的优缺点
  • 深圳东门买衣服攻略重庆网站seo公司
  • 长沙本土网站制作公司百度文库登录入口
  • 网站开发技术有哪些武汉关键词排名推广
  • 育婴网站模板下载百度安装
  • wordpress在线邮箱验证码seo怎么收费
  • 企业社会责任和企业建设北京seo排名公司
  • 新沂建设网站广州网站快速排名优化