WebRTC开发基础(WebRTC入门系列1:getUserMedia)

课程地址:零声学院 WebRTC入门与提高 https://ke.qq.com/course/435382?tuin=137bb271

技术支持QQ群:782508536

webrtc时序图.png

版权声明:关于作者:王昕(QQ:475660) 十多年开发经验,在Delphi、ASP.net、Cobol、WPF、C#、SharePoint、Java、XMPP Server/Client、EPortal、BPM等领域较有经验,对开源技术有广泛兴趣,尤其关注门户平台和即时通讯技术,在广州工作生活30余年。 https://blog.csdn.net/starcrm/article/details/52576387

博主有删减,著作权归原作者王昕所有。

什么是WebRTC

WebRTC由IETF(Internet Engineering Task Force——互联网工程任务组)和W3C(World Wide Web Consortium——万维网联盟)联合负责其标准化工作。IETF定制WebRTC的互联网基础协议标准,该标准也被称为RTCWeb(Real-Time Communication in Web-browsers)。W3C则负责定制WebRTC的客户端JavaScript API接口的标准。目前参与该技术标准定制的公司主要有思科、微软、谷歌、苹果、爱立信、Intel等。

WebRTC(Web Real-Time Communication——网页实时通信)是一个基于浏览器的实时多媒体通信技术。该项技术旨在使Web浏览器具备实时通信能力;同时,通过将这些能力封装并以JavaScript API的方式开放给Web应用开发人员,使得Web应用开发人员能够通过HTML标签和JavaScript API快速地开发出基于Web浏览器的实时音视频应用,而无需依赖任何第三方插件。谷歌2011年6月3日宣布向开发人员开放WebRTC架构的源代码。

WebRTC的影响和前景

WebRTC技术的快速普及将对现有的很多领域产生巨大的影响。 首先,受到影响的是现有的VoIP业务领域。目前我们正在经历一个硬件多样化的时代,比如可穿戴设备的兴起。这将促进适应新型设备的操作系统的涌现和加大现有操作系统的分化。因此,操作系统的异构性和繁杂性使得VoIP应用的开发、更新与维护的复杂性和成本剧增。随着WebRTC集成到浏览器中,基于Web的实时通信应用可以通过HTML标签和JavaScript API实现快速的开发,并避免了由于操作系统的异构性带来的重复开发和由于版本升级带来的维护费用以及不便。这将导致现有的应用开发人员从现有的基于浏览器插件或者原生VoIP应用模式转向使用WebRTC进行Web应用开发,进而使得现有的VoIP应用的普通用户向基于浏览器的Web应用的迁移。目前,涉及VoIP业务的客服以及在线教育领域很关注WebRTC技术在自身领域的应用。

其次,现有的IM应用通过其拥有的大量用户,并通过构建在这些IM应用上的衍生应用形成生态圈。这些IM应用及其所形成的生态圈正在试图取代浏览器成为互联网入口。这种现象在移动智能终端表现的更加突出。然而,如上文所述,WebRTC技术的部署和使用将呈现爆炸式的增长,这将导致IM应用向IM Web应用的转变和用户向IM Web应用的迁移。因此,构建在现有IM应用的生态圈将被打破。现有的IM应用及其生态圈必将做出相应的布局调整以适应新的技术环境。

同时,WebRTC的普及将给企业带来监管和安全问题。目前,有些公司在公司内部封锁了IM应用(比如QQ,Skype)的端口,以防止员工在工作过程中由于对音视频工具的不慎使用所造成的安全问题。基于WebRTC的新型IM Web应用,与正常的Web页面无异,所以很难检测该种IM Web应用。这给企业的监管和安全造成了巨大的隐患。

其次,智能电视的展现形式和业务模式将受到巨大的影响。目前,智能电视主要包括智能操作系统以及显示设备。在智能电视上的主要业务也主要是对多媒体源的直播和点播。随着WebRTC的普及和涌现大量的IM Web应用,智能电视将很可能原生的包含摄像头设备。同时,视频会议业务也将像现在的对多媒体源的直播和点播业务一样,成为智能电视的主要业务。

其次,所上文所述,由于WebRTC所支持的音视频格式的局限,以及WebRTC在多人视频会话中采用的可选网状结构的限制(目前是6人)。新型的服务供应商将产生。这些供应商主要提供1)不同视频编解码的转换;2)在多人会话中,视频流的整合与广播。目前,服务供应商及其产品有:Dialogic推出的PowerMedia XMS 2.1和英特尔推出的Collaboration Service for WebRTC。

最后,集成了WebRTC的Web浏览器将进一步改变传统的应用、Web浏览器和操作系统的格局。Web浏览器将成为介于操作系统与Web应用的一个平台。为Web操作系统的普及进一步铺平道路。包含了WebRTC的浏览器将进一步巩固其互联网入口的地位——近些年,超级应用(例如微信)通过其拥有的大量用户和在其上的开发的衍生应用试图成为互联网入口。Web浏览器及其Web应用将成为一种生态圈。高性能浏览器的研发将成为下一个竞争热点。而浏览器的安全问题将更加凸显。

开发基础知识

本文大部分翻译自:

http://www.html5rocks.com/en/tutorials/webrtc/basics/

http://w3c.github.io/mediacapture-main/getusermedia.html

通常WebRTC程序需要实现以下需求:

  • 获得流音频,视频或其他数据。
  • 获取网络信息,如IP地址和端口,与其他WebRTC客户端(称为节点)连接通讯、交换数据,穿越NAT和防火墙。
  • 协调信令通信以报告错误、发起或关闭会话。
  • 客户端之间交换媒体和客户的信息,如分辨率和编解码器。
  • 通信流音频,视频或数据。
  • MediaStream API代表同步流媒体。例如,从摄像头和麦克风输入的流有同步的视频和音频曲目。(不要混淆mediastream轨道与<track>的元素,这是完全不同的东西。)

一个最简单的例子:
https://webrtc.github.io/samples/src/content/getusermedia/gum.

官方范例
https://webrtc.github.io/samples/

1、输入、输出
每个MediaStream具有一个输入,这可能由navigator.getUserMedia()生成;并仅具有一个输出,传递到video element或RTCPeerConnection;

2、getUserMedia参数
getUserMedia()方法需要三个参数:

  • 约束对象Constrain,通常是配置项;
  • 一个成功的回调,通过一个MediaStream;
  • 一个失败的回调,失败的回调是通过一个错误对象;

3、标签label、MediaStreamTracks数组

每个MediaStream都有一个标签label,如'xk7eulhsuhkbnjlwkw4yygnjj8onsgwhbvlq”
MediaStreamTracks数组是由getAudioTracks()和getVideoTracks()方法返回。

对于https://webrtc.github.io/samples/src/content/getusermedia/gum的例子
stream.getAudioTracks()返回一个空数组(因为没有音频)。
假设获得一个网络摄像头连接,stream.getVideoTracks()将返回MediaStreamTrack数组,表示流来自摄像头
每个MediaStreamTrack只有一种类型(“视频”或“音频”),和一个标签label(类似于“FaceTime HD Camera(内置)”)代表音频或视频的一个或多个通道。
在这种情况下(没有音频),gum的例子只有一个视频轨迹和没有音频。
更多的场景:得到前置摄像头,后置摄像头,麦克风流,以及“屏幕分享screenshared ' 应用。

** 4、Blob URL**
Chrome or Opera中:URL.createObjectURL()方法把一个MediaStream转换到Blob URL,可以设置为video element的src。

Blob URLs原理请阅读:http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers-bloburis
在Firefox中:视频的src可以从流本身来设置。

版本M25以上,以Chrome为基础的浏览器(Chrome和Opera),允许从getUserMedia音频数据传递给音频或视频元素(但请注意,默认情况下是静音的)。

getUserMedia 允许 as an input node for the Web Audio API:

// success callback when requesting audio input stream
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 the destination to hear yourself (or any other node for processing!)
    mediaStreamSource.connect( audioContext.destination );
}

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
navigator.getUserMedia( {audio:true}, gotStream );

Chrome浏览器添加音频捕获和/或videoCapture权限允许权限请求,可以只授予一次,此后,用户不被要求授予照相机或麦克风访问权限。同样的,在使用HTTPS网页:也只有授予一次(在Chrome至少一次)。显示在浏览器中的信息栏的始终允许“Always Allow”按钮。

此外,Chrome将在2015年底弃用getUserMedia()的HTTP访问。在Chrome M44你已经可以看到一个警告信息。

未来MediaStream可做为任何流的数据源,而不仅仅是照相机或麦克风。例如传感器或其它输入。

一些好玩的例子:

Webcam Toy is a photobooth app that uses WebGL to add weird and wonderful effects to photos which can be shared or saved locally.
FaceKat is a 'face tracking' game built with headtrackr.js.
ASCII Camera uses the Canvas API to generate ASCII images.

5、Constraints

用于设置视频分辨率getUserMedia()和RTCPeerConnection addStream()调用。
其目的是为执行其他约束,诸如宽高比,面向模式(正面或背面相机),帧率,高度和宽度......

例子:

getUserMedia({
     video: {
       mandatory: { minAspectRatio: 1.333, maxAspectRatio: 1.334 },
       optional [
         { minFrameRate: 60 },
         { maxWidth: 640 },
         { maxHeigth: 480 }
       ]
     }
  }, successCallback, errorCallback);
Dictionary MediaTrackConstraints Members

advanced of type sequence<MediaTrackConstraintSet>
See Constraints and ConstraintSet for the definition of this element.

dictionary MediaTrackConstraintSet {

            ConstrainLong      width;
            ConstrainLong      height;
            ConstrainDouble    aspectRatio;
            ConstrainDouble    frameRate;
            ConstrainDOMString facingMode;
            ConstrainDouble    volume;
            ConstrainLong      sampleRate;
            ConstrainLong      sampleSize;
            ConstrainBoolean   echoCancellation;
            ConstrainDouble    latency;
            ConstrainLong      channelCount;
            ConstrainDOMString deviceId;
            ConstrainDOMString groupId;
};

更多Media Capture and Streams 相关细节:

http://www.w3.org/TR/mediacapture-streams/

入门必读资源:

  1. Getting Started with WebRTC
  2. Media Capture and Streams接口定义
  3. WebRTC API
  4. javascript并发开发,必须了解Blob URLs原理
  5. webrtc samples
  6. webaudiodemos
  7. WebRTC samples Peer connection: audio only

以下内容待续

rtcpeerconnection
rtcdatachannel
一个ASP.NET MVC 在线录音录像(音视频录制并上传)Demo :
http://download.csdn.net/detail/starcrm/9394037

参考链接

http://javascript.ruanyifeng.com/htmlapi/webrtc.html
Andi Smith,Get Started with WebRTC
Thibault Imbert, From microphone to .WAV with: getUserMedia and Web Audio
Ian Devlin, Using the getUserMedia API with the HTML5 video and canvas elements
Eric Bidelman, Capturing Audio & Video in HTML5
Sam Dutton, Getting Started with WebRTC
Dan Ristic, WebRTC data channels
Justin Uberti, Sam Dutton, WebRTC: Plugin-free realtime communication
Mozilla Developer Network, Taking webcam photos
Sam Dutton, WebRTC in the real world: STUN, TURN and signaling

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容