AJAX(XHR) 与 MSE(Media Source Extensions) 参考代码!

探索WebKit的媒体源扩展:Web应用的多媒体革新 MSE是HTML5的一部分,它为Web开发者提供了一种在浏览器中处理媒体数据的方法,而无需依赖外部插件。通过MSE,开发者可以将媒体数据分割成小块,然后按需加载和播放,从而实现更高效的资源管理和更流畅的播放体验。WebKit的媒体源扩展为Web应用的多媒体播放带来了革命性的变化。通过本文的介绍和代码示例,我们可以看到MSE如何使开发者能够以更灵活、更高效的方式处理媒体数据。随着Web技术的发展,MSE将继续在提升用户多媒体体验方面发挥重要作用。 阅读详情








<!DOCTYPE html>
<!--
Copyright 2013 Eric Bidelman

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Author: Eric Bidelman (ebidel@)
-->
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<title>MediaSource API Demo</title>
<!--
<link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
-->
<style>
::selection {
  color: #fff;
  background: pink;
}
html, body {
  overflow: hidden;
  height: 100%;
}
body {
  margin: 0;
}
body {
  color: #222;
  font-family: 'Open Sans', arial, sans-serif;
  display: -webkit-flex;
  -webkit-align-items: center;
  -webkit-justify-content: center;
  -webkit-flex-direction: column;
  display: -ms-flex;
  -ms-align-items: center;
  -ms-justify-content: center;
  -ms-flex-direction: column;
  display: -moz-flex;
  -moz-align-items: center;
  -moz-justify-content: center;
  -moz-flex-direction: column;
  display: -o-flex;
  -o-align-items: center;
  -o-justify-content: center;
  -o-flex-direction: column;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}
details {
  position: absolute;
  top: 1em;
  left: 1em;
  margin: 1em 0;
  cursor: pointer;
  padding: 10px;
  background: #fff;
  border: 1px solid rgba(0,0,0,0.3);
  border-radius: 5px;
  max-width: 600px;
  font-size: 10pt;
  z-index: 100;
}
details > div {
  margin: 10px 0;
}
details blockquote {
  font-style: italic;
}
pre:not(#log) {
  background: #eee;
  border-radius: 5px;
  padding: 3px 17px 20px 17px;
  border: 1px solid #ccc;
  color: navy;
}
#log {
  margin: 0 1em;
}
code {
  font-weight: bold;
}
section {
  display: -webkit-flex;
  display: flex;
}
</style>
</head>
<body>

<details>
  <summary>What is this?</summary>
  <div>
    <p>This demo splits a <a href="Chrome_ImF.webm">.mp4 video</a> into
    <span data-num-chunks></span> chunks using the File APIs. The entire movie
    is then 'streamed' to a <code>&lt;video&gt;</code> element by appending each
    chunk using the
    <a href="http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html" target="_blank">MediaSource API</a>.</p>
    <p><b>Support:</b> Chrome Dev Channel 17+ and the <code>--enable-media-source</code> flag set. The feature is enabled
      by default in Chrome 23, which also updated its implementation to the new version of the API.</p>
  </div>
</details>

<h3>Appending .mp4 video chunks using the Media Source API</h3>

<section>
  <video controls autoplay ></video>
  <!--  <video controls autoplay width="320" height="240"></video>-->
  <pre id="log"></pre>
</section>

<!--
<pre><code>
var ms = new MediaSource();

var video = document.querySelector('video');
video.src = window.URL.createObjectURL(ms);

ms.addEventListener('sourceopen', function(e) {
  ...
  var sourceBuffer = ms.addSourceBuffer('video/mp4; codecs="mp4"');
  sourceBuffer.appendBuffer(oneVideoWebMChunk);
  ....
}, false);
</code></pre>
-->

<script>
function Logger(id) {
  this.el = document.getElementById('log');
}
Logger.prototype.log = function(msg) {
  var fragment = document.createDocumentFragment();
  fragment.appendChild(document.createTextNode(msg));
  fragment.appendChild(document.createElement('br'));
  this.el.appendChild(fragment);
};

Logger.prototype.clear = function() {
  this.el.textContent = '';
};

var logger = new Logger('log');
</script>


<script>
var FILE = 'test.mp4';
//var FILE = 'kms2479_final.mp4';
//var FILE = 'kms0009_AustinPowers.m2t';
var NUM_CHUNKS = 5;
var video = document.querySelector('video');

window.MediaSource = window.MediaSource || window.WebKitMediaSource;
if (!!!window.MediaSource) {
  alert('MediaSource API is not available');
}

var mediaSource = new MediaSource();

document.querySelector('[data-num-chunks]').textContent = NUM_CHUNKS;

video.src = window.URL.createObjectURL(mediaSource);

function callback(e) {
  alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> leosu add log here...... callback   here should only call once!");
    var sourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="mp4"');
  //var sourceBuffer = mediaSource.addSourceBuffer('video/mp2t; codecs="mpv"');

  logger.log('mediaSource readyState: ' + this.readyState);

  GET(FILE, function(uInt8Array) {
      alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> leosu add log here...... GET  ");
      //logger.log('uInt8Array: ' + uInt8Array);
    var file = new Blob([uInt8Array], {type: 'video/mp4'});
    //var file = new Blob([uInt8Array], {type: 'video/mp2t'});
    var chunkSize = Math.ceil(file.size / NUM_CHUNKS);

    logger.log('num chunks:' + NUM_CHUNKS);
    logger.log('chunkSize:' + chunkSize + ', totalSize:' + file.size);

    // Slice the video into NUM_CHUNKS and append each to the media element.
    var i = 0;

    (function readChunk_(i) {
      var reader = new FileReader();

      // Reads aren't guaranteed to finish in the same order they're started in,
      // so we need to read + append the next chunk after the previous reader
      // is done (onload is fired).
      reader.onload = function(e) {
          
          alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> leosu add log here...... GET  e.target.result is: " + e.target.result);
        sourceBuffer.append(new Uint8Array(e.target.result));
        logger.log('appending chunk:' + i);
        if (i == NUM_CHUNKS - 1) {
        //if (i == 10) {
          mediaSource.endOfStream();
        } else {
          if (video.paused) {
            video.play(); // Start playing after 1st chunk is appended.
          }
          readChunk_(++i);
        }
      };

      var startByte = chunkSize * i;
      var chunk = file.slice(startByte, startByte + chunkSize);

      reader.readAsArrayBuffer(chunk);
    })(i);  // Start the recursive call by self calling.
  });
}

mediaSource.addEventListener('sourceopen', callback, false);
mediaSource.addEventListener('webkitsourceopen', callback, false);

mediaSource.addEventListener('webkitsourceended', function(e) {
  logger.log('mediaSource readyState: ' + this.readyState);
}, false);

function GET(url, local_callback) {
    
    alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> leosu add log here...... GET url is: " + url);
  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.responseType = 'arraybuffer';
  xhr.send();

  xhr.onload = function(e) {
    if (xhr.status != 200) {
      alert("Unexpected status code " + xhr.status + " for " + url);
      return false;
    }
    alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> leosu add log here...... GET will call local_callback");
    local_callback(new Uint8Array(xhr.response));
  };
}
</script>
<!--
<script>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-22014378-1']);
_gaq.push(['_trackPageview']);

(function() {
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
-->
<!--[if IE]>
<script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
<script>CFInstall.check({mode: 'overlay'});</script>
<![endif]-->
</body>
</html>

Python爬虫第四课:Network、XHR、json 在爬虫实践当中,如果我们爬取的页面的编写没有做好板块的区分,或者我们选取的标签不合适,最终我们获得的结果会多提取到出一些奇怪的东西。 当使用用request获取的网页源代码里没有我们想要的数据时,需要重新思考。 一、认识Network 在网页空白处,点击右键-检查,第一个是Elements,往右看就能找到Network。 Network的功能是:记录在当前页面上发生的所有请求。 现在看上去... 阅读详情

相关推荐

live-stream-media-source-extensions:使用ffmpeg,node.js,socket.io和express在媒体源扩展上对h264编码的mp4视频进行实时流mp4编码。 适用于chrome,firefox,safari和android。 不兼容iOS。 工作已移至mse-live-player回购=>

已封存。 请查看其他一些可帮助您进行视频流冒险的存储库: 实时流媒体源扩展 使用ffmpeg,node.js,socket.io和express在媒体源扩展上实时播放h264编码的mp4视频。 适用于chrome,firefox,safari和android。 不兼容iOS。 git clone https://github.com/kevinGodell/live-stream-media-source-extensions.git cd live-stream-media-source-extensions npm install node index.js 打开浏览器到localh

Web端直接播放 .ts 视频及mux.js播放ts视频没有声音

最近项目中需要前端播放 .ts 格式视频,捣鼓了几天学习到很多知识,也发掘了一种优秀的解决方案,分享给有同样需求的同学。

細水、長流√的专栏 5576

国密系列算法简介

众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中,期待有一天会有采用国密算法的区块链应用出现。其中SM1、SM7算法不公开,调用该...

HardessGod的博客 5775

初识爬虫——Network,XHR,json简析

本文介绍了网页爬虫所需要了解的几个概念,希望对你有帮助,加油,希望你我一同走进爬虫的世界~~

weixin_53919192的博客 2772

从原理到调试:一次搞懂Camera Sensor的曝光、增益与帧率三角关系

本文深入解析Camera Sensor中曝光、增益与帧率之间的动态平衡关系,揭示低光环境下帧率下降的根本原因。通过实际调试案例和底层公式分析,帮助开发者理解如何优化相机参数设置,实现画质与流畅度的最佳平衡。

weixin_31310913的博客 429

MIPI信号的分析--结合示波器实际测试波形

如果排查的思路对你有帮助,请记住 消雨匆匆 or 大吊工。码字和排查很累,仅此而已 ,硬件不是抄电路,拿烙铁,懂点软件,细致分析,找问题和破案搜集线索是一样的。 部分内容来自于此博客的大神总结: http://www.elecfans.com/news/wangluo/20170323499614.html http://www.elecfans.com/yuanqijian/jieko...

消雨匆匆 4万+

H5直播之MSE(Media Source Extensions)

参考w3c media-sourceMedia Source 系列 - 使用 Media Source Extensions 播放视频全面进阶 H5 直播无 Flash 时代,让直播拥抱 H5(MSE篇)使用 MediaSource 搭建流式播放器 一、MSE 意义 1.粗识 HTML5 video 标签和MSE媒体源扩展 当前网页上能够搜到的HTML5和MSE相关的内容一抓一大把,本文的目的是尽量用较短的篇幅,简述浏览器为何要使用HTML5的MSE扩展。这也是在我最开始接触有关内容时的最大的疑惑。

shadow_zed的博客 6549

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

王老师青少年编程 2023

媒体源扩展(MSE)介绍

MSE,即媒体源扩展,可以理解为一种API,其提供了实现无插件且基于Web的流媒体的功能。通过MSE,媒体串流能够通过JavaScript创建,并且可以使用HTML5的和标签进行播放。

liitdar的博客 7188

2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真

1.题目 给定两个单电源的双运放芯片READ2302G芯片(当时记得增益带宽积好像是6M),一片HD74LS74数字芯片双D触发器,需要详细电路图、手写报告,5个波形输出,测频,测幅,8:00公布题目,15:00停止答题,中间可以吃饭(也可以不吃继续做),15:00清场,休息一段时间后开始进场测试,打分。 2.要求 (1)一片运放搭建方波振荡电路,频率 20 KHz,误差 0.1 KHz,幅度 3...

DengFengLai123的博客 2万+

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2584

Javascrit中使用MediaSource播放加密视频

1、基本概念 MediaSource        MediaSource是一个表示媒体资源HTMLMediaElement对象的接口。 MediaSource对象可以附着在HTMLMediaElement在客户端进行视频播放。区别于传统的直接在video标签中写上 src="//server/media/demo.mp4" 的用法,MediaSource的使用要稍微复杂一点。     ...

camike的博客 1万+

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

HTML5 直播协议之 WebSocket 和 MSE

原文出处:直播社区 当前为了满足比较火热的移动 Web 端直播需求, 一系列的 HTML5 直播技术迅速的发展了起来. 常见的可用于 HTML5 的直播技术有 HLS, WebSocket 与 WebRTC. 今天我要向大家介绍一下 WebSocket 与 MSE 相关的内容, 并在最后通过一个实际的例子, 来展示其具体的用法. 大纲 WebSocket 协议介绍. WebS

直播社区 5072

100天精通Python(爬虫篇)——第114天:爬虫基础模块之requests基础入门

一、request模块大总结 1. 下载安装 2. 常用属性或方法 3. response.text和response.content的区别: 4. 发送带headers参数请求 5. 发送带参数请求 6. 在headers参数中携带cookie 7. 超时参数timeout的使用 8. proxies代理参数的使用 9. 发送post请求...............

努力让自己发光,对的人才能迎着光而来 11万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

H5-MediaSourceExtension

H5-MediaSourceExtension 目录 文章目录前言推荐阅读介绍诞生原因`MSE`标准缺点注意`DASH`协议优势常见特点缺点与对比接口`MediaSource`注意解决办法`Media Source Extension`转码开始测试的视频需要的工具引入方法检测片段基于`Fetch API` 前言 推荐阅读 MDN-MSE API H5直播系列二 MSE(Media Source Extensions)-MSE-简书 官方文档翻译 介绍 媒体源扩展 API(MSE) 提供了实现无插件且

莫兮的博客 579

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

html5 媒体源,HTML5 媒体源扩展API(Media Source Extensions)

在HTML4中,浏览器并没有实现对多媒体文件的播放,于是Flash应运而生,给浏览器实现事动画、视频、音频等的播放,于是Flash红级一时。HTML5的到来,带来了浏览器卫生对动画、视频、音频的支持,导致了Flash的淘汰。在HTML5中,如果我们需要对一个视频文件播放,我们仅仅只需要简单实用以下代码:在上面这段代码中,我们只简单写了一个标签,就可以实现视频的播放,但是这段带码有很强的限制,vid...

weixin_28543661的博客 925

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

H5流式播放(FMP4转封装与mediaSource)

mediaSource接口的介绍W3C上有明确关于mediaSource 扩展接口的文档。mediaSource 扩展文档中是这么定义的, 它允许JS脚本动态构建媒体流用于和,允许JS传送媒体块到H5媒体元素。这种接口的应用可以让h5播放器实现持续添加数据进行播放。做as的朋友都知道as中的appendBytes方法,一种添加二进制数据进行播放的方式。这两种接口在概念上是类似的。只是里面的定义和对媒

尤卡里的专栏 2万+

H5直播系列二 MSE(Media Source Extensions)

转自https://www.jianshu.com/p/1bfe4470349b 参考 w3c media-source Media Source 系列 - 使用 Media Source Extensions 播放视频 全面进阶 H5 直播 无 Flash 时代,让直播拥抱 H5(MSE篇) 使用 MediaSource 搭建流式播放器 一、MSE 意义 1.粗识 HTML5 video 标签和...

NBA_1的博客 5142

WebKit媒体播放权限:掌控Web音频与视频的钥匙

WebKit的媒体播放权限支持为开发者提供了强大的工具,以创建尊重用户偏好的Web应用。通过本文的介绍和代码示例,我们可以看到如何利用WebKit的能力来实现媒体播放的精细控制。随着Web技术的发展,WebKit将继续增强其媒体播放功能,推动Web应用在多媒体领域的创新和进步。对于Web开发者来说,掌握这些技术是提升用户体验的关键。

2401_85341950的博客 1006

Media Source Extensions (MSE):通过 JavaScript 进行流媒体处理

在Web开发中,随着对流媒体和视频处理需求的增加,Media Source Extensions (MSE) 提供了一种通过JavaScript API来处理音频和视频流的方法。MSE允许开发人员直接在浏览器中控制媒体流的播放,而无需依赖传统的视频播放器插件。Media Source Extensions (MSE) 是一种强大的 JavaScript API,它使得开发人员能够直接控制浏览器中的音频和视频流,而无需依赖于外部插件。

lostdeer 2142

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中,Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式,对此,目前标准中包含了三种编码格式,它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开发的一个开放标准,不需要任何授权费用,它使用Theora作为视频编码格式和Vorbis作为音频编码格式。MPEG4是MPEG工作组开发的需要授权费用的标准,它使用H.264作为视频编码格式和AAC作为音频编码格式。而WebM是由G

jyl_sh的专栏 1264

IOS H5页面中 HLS视频无法正常播放,使用hls.插件

IOS H5页面中 HLS视频无法正常播放,使用hls.插件

w1404273025的博客 5848

Chrome 开发工具之Network

经常会听到比如"为什么我的js代码没执行啊?","我明明发送了请求,为什么反应?","我这个网站怎么加载的这么慢?"这类的问题,那么问题既然存在,就需要去解决它,需要解决它,首先我们得找对导致问题的原因,才能"对症下药"。 每个文件的载入、每次发送的请求也都是一次网络交互,所以在这个面板中,我们能够看到我们所需要的js文件是否被加载?我们所请求的接口到底返回了没有?我们能够知道哪个文件拖慢了整个...

weixin_33958366的博客 557

网页中播放RTSP(5) WebSocket播放视频

WebSocket播放视频是结合MediaSource的 总结:通过WebSocket获取视频流,提供给MediaSource,MediaSource结合video标签,播放视频。 这一套完全就是基于浏览器支持MediaSourceExtension(MSE)的,而我最终的目的是在unity3d里面播放视频,加入uinty3d不支持MediaSource和video标签,怎么折腾都没用。可能最...

llhswwha的专栏 7122
上一篇: 中国化的P2P金融都有哪些特色?
下一篇: 每个人都有自己的诉求
bamboolsu
博客等级 码龄22年 200粉丝 394原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值