webrtc学习———记录三:mediaStreamTrack
参考:
https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack
转自http://c.tieba.baidu.com/p/3312565203
http://c.tieba.baidu.com/p/3312569139
http://c.tieba.baidu.com/p/3312680272
Network Stream API
MediaStream (别名 getUserMedia)
MediaStream API 代表媒体数据流的同步。举个例子,从相机获取的视频流的同步和跟踪。
理解MediaStream最简单的方法应该就是看看它的实际应用:
在Chrome或Opera中, 打开这个demo simpl.info/gum。
打开命令行。
查看全局范围的数据流变量。
每个MediaStream都有一个输入,这个输入可以理解成MediaStream生成的一个导航器。getUserMedia()可以传输视频元素或者是RTCPeerConnection。
getUserMedia()方法有三个参数:
一个 约束对象
一个成功的回调,如果成功会回传一个MediaStream
一个失败的回调,如果失败会回传一个error对象。
每个MediaStream都有一个标签,像*Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ*一样,getAudioTradks()和getAudioTracks()方法会回传一个MediaStreamTracks对象的数组。
针对 simpl.info/gum 这个例子来说,stream.getAudioTracks() 返回了一个空数组 (因为没有音频) , 假设已经有一个摄像头连接成功,getVideoTracks()会返回一个MediaStreamTrack对象的数组, 这个数组代表从摄像头得到的数据流。每个MediaStreamTrack都有一个类型 (*video* 或 *audio*), 和一个标签(代表一个或多个频道的音频或视频),在这个例子中,只有video track,但是很容易想象到可以用到这个例子的地方,比如一个聊天应用程序的前置摄像头、后置摄像头,一个屏幕分享软件等等。
在Chrome或Opera中, URL.createObjectURL() 方法把MediaStream 转换成了一个 Blob URL,Blob URL可以看成一个视频元素的src。 (在Firefox和Opera中,视频的src可以通过数据流本身设定)。
getUserMedia 也可以作为网络音频API的输入节点:
function gotStream(stream) {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
// Create an AudioNode from the stream
var mediaStreamSource = audioContext.createMediaStreamSource(stream);
// Connect it to destination to hear yourself
// or any other node for processing!
mediaStreamSource.connect(audioContext.destination);
}
navigator.getUserMedia({audio:true}, gotStream);
基于Chromium的应用和扩展可以合并getUserMedia。在manifest 中添加audioCapture 和 videoCapture权限可以在加载的时候得到(仅一次)授权,毕竟加载之后用户不会有对摄像头或麦克风的访问请求。同样,forgetUserMedia()也是只有一次授权。
他的最终目的是使MediaStream能取到任意的数据源,不只是局限于摄像头或是手机。这将拿其兼容其他输入,如传感器等。
需要注意的是getUserMedia()必须在服务器上使用,而不是本地文件中,否则的话将会抛出权限的错误。
getUserMedia() 已经成功的融合了其它的JavaScript APIs和库:
Webcam Toy 是一个photobooth应用,它使用WebGL来添加一些特效,让用户可以共享照片或是保存本地。
FaceKat 是一个人脸追踪的游戏,使用headtrackr.js。
ASCII Camera 使用Canvas API来生成ASCII码的图片。
约束
约束 在Chrome 24和Opera 18版本之后被引入。它们可以被用来设置 getUserMedia()和RTCPeerConnection addStream() 这些视频的流的分辨率。 约束的实现是为了制约例如视频高度和宽度的比例、帧率、和正反摄像头模式等等……
针对约束,这里有一个例子: simpl.info/getusermedia/constraints.
一个陷阱:getUserMedia约束在浏览器所有选项卡影响约束后完成后才设置,设置一个错误的值会发生以下错误:
navigator.getUserMedia error:
NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}
屏幕和标签捕获你同样可以利用MediaStream捕获屏幕和标签的数据源。它已经在Chrome中实现了像这个例子一样,但是在Opera上还没有实现。
Chrome应用很多都已经实现了通过chrome.tabCaptureAPI 分享在线录播的功能。更多具体的信息,如屏幕录制的编码,请到 Screensharing with WebRTC上进行相关学习,但是目前只支持Chrome。
信号: session控制,网络和多媒体信息
WebRTC使用RTCPeerConnection进行两个浏览器之间的数据流的通信,但是也需要一种机制来协调沟通控制信息,这一个过程叫做信号。信号的方法和协议不是WebRTC指定的,而是RTCPeerConnection API的一部分。
相应的,WebRTC应用开发者可以选择任意一种自己喜欢的消息协议,比如SIP或是XMPP,也可以选择任何适当的双工协议,apprtc.appspot.com 这个例子使用XHR和Channel API机制的信号,codelab是我们构建的通过Socket.io运行在 Node服务器上的应用。
信号用来交换以下三个类型的信息:
Session控制信息:用来初始化或是关闭通信,并报告错误。
网络配置:本机的IP和端口等配置。
媒体功能:编码解码器配置。
信号的配置必须没有任何差错,在完成点对点的传输之后就可以通过信号交换信息。
举个例子,想像一下如果Jack Ma要和Jobs通信,这里有个demo来自于WebRTC W3C Working Draft, 它展示了信号的行为。下面的的代码假设某种信号机制的存在,在createSignalingChannel方法中创建。还要注意:在Chrome,Opera中使用RTCPeerConnection是目前的前提。
var signalingChannel = createSignalingChannel();
var pc;
var configuration = ...; // run start(true) to initiate a call
function start(isCaller) {
pc = new RTCPeerConnection(configuration); // send any ice candidates to the other peer
pc.onicecandidate = function (evt) {
signalingChannel.send(JSON.stringify({ "candidate": evt.candidate }));
}; // once remote stream arrives, show it in the remote video element
pc.onaddstream = function (evt) {
remoteView.src = URL.createObjectURL(evt.stream);
}; // get the local stream, show it in the local video element and send it
navigator.getUserMedia({ "audio": true, "video": true }, function (stream) {
selfView.src = URL.createObjectURL(stream);
pc.addStream(stream); if (isCaller)
pc.createOffer(gotDescription);
else
pc.createAnswer(pc.remoteDescription, gotDescription); function gotDescription(desc) {
pc.setLocalDescription(desc);
signalingChannel.send(JSON.stringify({ "sdp": desc }));
}
});
} signalingChannel.onmessage = function (evt) {
if (!pc)
start(false); var signal = JSON.parse(evt.data);
if (signal.sdp)
pc.setRemoteDescription(new RTCSessionDescription(signal.sdp));
else
pc.addIceCandidate(new RTCIceCandidate(signal.candidate));
};
首先,Jack Ma和Jobs要交换网络信息。 (表达式 *finding candidates*指向查找网络接口和端口的进程,通过ICE framework完成)
Jack ma通过onicecandidatehandler创建一个RTCPeerConnection对象。
handler在网络通的时候开始执行。
Jack Ma发送将序列化的数据发送给Jobs,通过WebSock或其它机制建立信号。
当Jobs收到这些序列化的信息之后,他会调用saddIceCandidate, 来添加远程连接的候选地址。
WebRTC 客户端(也就是我们所说的端点,Jack Ma和Jobs)也需要确定和交换本地和远程音频、视频的媒体信,如分辨率和编解码器等功能。
webrtc学习———记录三:mediaStreamTrack的更多相关文章
- JavaScript学习记录三
title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 3.VUE前端框架学习记录三:Vue组件化编码1
VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...
- leveldb 学习记录(三) MemTable 与 Immutable Memtable
前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...
- 下页小希学MVC5+EF6.2 学习记录三
目的:1 学习mvc+ef 2 写下日记也是对自己的督促 期待已久的EF终于来了. 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型 ...
- ES6深入学习记录(三)编程风格
今天学习阮一峰ES6编程风格,其中探讨了如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的.易于阅读和维护的代码. 1.块级作用域 (1)let 取代 v ...
- webrtc学习——mediaStream和MediaStreamTrack
This is an experimental technologyBecause this technology's specification has not stabilized, check ...
- webrtc学习———记录一
最近导师让研究一下webrtc,希望将来用到我们的ICT2系统中. 但是从来没有过做web的基础,无论前端还是后端,html.js全都从头学起.html还好说,没有太过复杂的东西. js就有点难度了, ...
- 定时任务调度工作(学习记录 三)timer其他重要函数
TimerTask的两个重要函数: 1.cancel() 作用: 取消当前TimerTask里的任务 演示: 先在继承了TimerTask的类中添加一个计时器,然后在run方法中合适的位置添加canc ...
- zeromq学习记录(三)使用ZMQ_PULL ZMQ_PUSH
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
随机推荐
- BitMap 内存使用优化
在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...
- How to: Use a Custom User Name and Password Validator
在wcf中使用自定义的用户名和密码验证方式 https://msdn.microsoft.com/en-us/library/aa702565.aspx http://www.codeproject. ...
- bzoj1232
由题意知,最后要保留的边肯定都要被走过 来回一条边所花费的时间=2*边长+安慰边两端的牛所要花的时间和 总时间就等于所保留边来回的时间和+根节点时间: 不难想到做一下最小生成树即可 贪心可知,根一定选 ...
- 代码演示C#中string和StingBuilder内存中的区别
关于 string和StringBuilder的区别参考MSDN.本文用程序演示它们在内存中的区别,及其因此其行为不同. //Demo string memory model namespace C ...
- oracle报错ORA-01507
SHUTDOWN IMMEDIATE; STARTUP NOMOUNT; CONTROL1.CTL文件复制到CONTROL2.CTL; ALTER SYSTEM SET CONTROL_FILES=' ...
- 利用spm提供的MoAEpilot听觉数据学习预处理以及单被试glm分析与统计推断
1.数据介绍 下载:http://www.fil.ion.ucl.ac.uk/spm/data/auditory/ SUBJECT:1 VOLUME: 64*64*64 TR:7s total acq ...
- 在Apache上部署Django
跟php类似,要想使Apache能够处理python脚本(实际上Apache是不能处理脚本的,只是利用别的扩展模块处理相应脚本),就要给Apache安装相应的扩展模块. Apache起初的python ...
- [洛谷U871]building
题目来源:http://www.luogu.org/problem/show?pid=U871# [题目背景 Background] WOW是BLIZZARD公司开发的一款网络游戏,游戏的背景是处在一 ...
- Android学习笔记(八)深入分析Service启动、绑定过程
Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...
- SDPLR的安装过程(matlab)
SDPLR 半正定规划优化工具的安装过程很简单,只要按照SDPLR 1.03-beta User's Guide (short version).pdf的介绍安装就可以. 运行在下载的工具包目录里运行 ...