WebRTC学习笔记_Demo收集

1.     WebRTC学习


1.1   WebRTC现状


本人最早接触WebRTC是在2011年底,那时Google已经在Android源代码中添?了webrtc源代码,放在/external/webrtc/,可是Android并没实用到它,更没有被浏览器使用。当时试图在Android 2.3(Gingerbread)高通平台的手机上用H.264 硬件codec替换掉WebRTC缺省使用的VP8软codec,费了不少劲勉强换掉后效果非常差仅仅得放弃。

近期得知Google最新版的Chrome for Android已经支持WebRTC,应老板的要求搭一个手机浏览器上视频通信的demo,为此在网上搜集各种资料,发现经过一年多的发展,国内外研究和使用WebRTC的人明显多起来,可用的demo也非常多。在此做一个笔记,留作日后參考。

眼下基于WebRTC的开发事实上有两个方向,一个是基于浏览器的WebRTC应用开发,编程语言主要是JavaScript、HTML等,这也是WebRTC作为HTML5标准的组成部分原本的目的;还有一个是C层面的移植和开发,作为一款非常强大的开源软件,非常多领域的软件项目都能够利用到WebRTC的音视频通信和处理能力,这些场合的应用程序可能是C语言写的,也不一定与浏览器有关。本文是属于前一种方向。

1.2   WebRTC基本概念学习

WebRTC的官方资料能够从其官网http://www.webrtc.org/和W 3C站点http://www.w3.org/TR/webrtc/上看到。

学习WebRTC基础知识比較好的站点是《Getting Started with WebRTC》,网址是http://www.html5rocks.com/en/tutorials/webrtc/basics/,这个也是官网上推荐的。

对浏览器来说,WebRTC事实上就是提供了3个API:

MediaStream
(即getUserMedia),用于获取媒体数据,比如来自摄像头和麦克风的视频流和音频流;

RTCPeerConnection,用于peer跟peer之间呼叫和建立连接以便传输音视频数据流;

RTCDataChannel,用于peer跟peer之间传输音视频之外的一般数据。

须要注意的是这几个API的名称在不同浏览器及同一浏览器的不同版本号之间略有差异,比方PeerConnection在FireFox上叫做mozRTCPeerConnection,而在当前版本号的Chrome上叫做webkitRTCPeerConnection,将来WebRTC标准化完毕后会把这些前缀去掉使用统一的名称。

眼下网上找到的WebRTC
demo都仅仅用到了getUserMedia和RTCPeerConnection这两个API,还有一个API即RTCDataChannel似乎眼下还不太成熟。

WebRTC是实现peer to peer的实时通信(可以两个或多个peer之间),在可以通信前peer跟peer之间必须建立连接,这是RTCPeerConnection的任务,为此须要借助一个信令server(signaling server)来进行,信令包含3种类型的信息:

Session
control messages: 初始化和关闭通信,及报告错误;

Network
configuration: 两方的IP地址和port号(局域网内部IP地址需转换为外部的IP地址);

Media
capabilities: 两方的浏览器支持使用何种codecs以及多高的视频分辨率。

WebRTC并未规定使用何种信令机制和消息协议,象SIP、XMPP、XHR、WebSocket这些技术都能够用作WebRTC的信令通信。

除了信令server,peer跟peer建立连接还须要借助还有一种server(称为STUN server)实现NAT/Firewall穿越,由于非常多peer是处于私有局域网中,使用私有IP地址,必须转换为公有IP地址才干相互之间数据传输。这当中涉及到一些专业术语包含STUN、TURN、ICE等,详细的本人还有待学习。网上找到的WebRTC demo好象都用的是Google提供的STUN server。

peer跟peer之间一旦建立连接就能够直接传输音视频数据流,并不须要借助第三方server中转。

2.     WebRTC封装库

WebRTC的目的是为了简化基于浏览器的实时数据通信的开发工作量,但实际应用编程还是有点复杂,尤其调用RTCPeerConnection必须对怎样建立连接、交换信令的流程和细节有较深入的理解。因此有高人为我们开发了WebRTC封装库,将WebRTC的调用细节封装起来,包装成更简单的API,使开发应用程序更简单。封装库的还有一个目的是为了屏蔽不同浏览器之间的差异,比如上面说的API名称的差异。当然,这些库都是开源的,能够依据自己的须要又一次改动。

眼下网上找到的有两种WebRTC封装库,一个是webrtc.io,网址是https://github.com/webRTC/webRTC.io,上面有具体说明和用法,有非常多demo使用它;还有一个是SimpleWebRTC,网址是https://github.com/HenrikJoreteg/SimpleWebRTC,貌似比webrtc.io用起来更简单。

3.     WebRTC
demo
试用

网上能够找到一堆WebRTC
demo,在code.google.com上也能找到不少WebRTC应用项目的源代码。有些demo是直接调用WebRTC API开发的,但大多数是调用上述两种WebRTC封装库开发的。因为WebRTC API的名称在不同浏览器及同一浏览器的不同版本号之间存在差异,所以不是全部demo都能执行在全部浏览器上。

为了找到一个可在公司局域网环境中跑在手机上的WebRTC
demo,本人试用了不少demo,以下选几个有代表性的介绍,当中有两个经改动后已在本人公司的局域网环境中执行成功。

先说一下本人的測试环境:手机上的浏览器是Chrome for Android
26.0.1410.49,执行在Android 4.1.2上,这个Chrome版本号本身是beta版,支持WebRTC但缺省是关闭WebRTC功能的,须要在chrome://flags中使能WebRTC并重新启动Chrome,或者在启动Chrome时添加?命令行选项--enable-webrtc。本人在PC上执行WebRTC的浏览器是Chrome 26.0.1410.43,操作系统是Windows 7。

3.1  http://www.webrtc.org/demo(https://apprtc.appspot.com/)

这是官方的demo,功能非常全,可惜不知为何https://apprtc.appspot.com/这个网址已经连不上了,只是其源代码还是能够下载到的,在https://code.google.com/p/webrtc-samples/。此demo没实用不论什么封装库。

这个demo所使用的信令机制使用了XHR和Google App Engine Channel API ,详细我不懂。

在我的公司局域网环境里无法执行该demo。

3.2   爱立信实验室开发的WebRTC
demo

据说是第一个基于浏览器的WebRTC视频通信demo,爱立信为此还开发了一个浏览器用于支持WebRTC,好象也是基于WebKit的,叫做Bowser browser(当时市场上可能还没有支持WebRTC的浏览器),该项目网址是https://labs.ericsson.com/apps/bowser。这个Bowser browser好象仅仅支持Ubuntu 11.04 and 11.10(见https://labs.ericsson.com/apis/web-real-time-communication/downloads)。

该demo的网址是http://webrtc.labs.ericsson.net:8082

在我的公司局域网环境里无法执行该demo。

3.3   人脸检測识别

利用WebRTC的getUserMedia从摄像头获取图像进行人脸识别的demo,比如这两个:

http://neave.com/webcam/html5/face/

http://www.raymondcamden.com/demos/2012/mar/29/test1.html

这两个demo在PC和手机上的Chrome上都可执行。

3.4   http://www.simpl.info

这个demo演示HTML, CSS and
JavaScript的各种feature和用法,包含WebRTC的3个API:getUserMedia、RTCPeerConnection、RTCDataChannel的演示,但遗憾的是RTCPeerConnection的演示仅仅是本地camera的画面传回给本地,并没有实现真正的设备之间音视频通信。

该项目的源代码在https://github.com/samdutton/simpl

3.5   Framegrabber

这是一个基于WebRTC实现屏幕共享(screensharing)的Chrome扩展,源代码在https://github.com/samdutton/rtcshare,有关介绍可參考这篇文章:http://blog.sina.com.cn/s/blog_51396f890102es7k.html

本人没有试用过。

3.6   http://webrtc.dennis.is

这个demo是基于库webrtc.io实现的,是webrtc.io官方的demo,使用WebSocket作为信令手段。

在我的公司局域网环境里无法执行该demo;在家里无线路由器环境下可成功执行,但仅仅能单向传输视频。

3.7   http://v.kainy.cn

国内牛人做的,相当于是汉化版的http://webrtc.dennis.is,自然也是基于webrtc.io实现的,但使用的webrtc.io版本号较老,不支持新版本号Chrome所使用的API名称webkitRTCPeerConnection,所以无法在新版本号Chrome上执行。详细介绍在http://blog.kainy.cn/2013/01/webrtc实现的视频聊天室应用/

3.8   http://conversat.io

这个demo是基于库SimpleWebRTC实现的,是SimpleWebRTC官方的demo,使用WebSocket作为信令手段。

在我的公司局域网环境里无法执行该demo;在家里无线路由器环境下可成功执行,且可双向传视频,支持多个peer同一时候视频通信。

经改动后在本人公司局域网成功执行,试过两个手机和一个笔记本电脑同一时候视频通信OK。改动和执行步骤:

1.     从http://www.nodejs.org/download/下载nodejs最新版并安装,我是在Windows7 64位上安装的;

2.     在命令行下依次执行例如以下命令(安装执行signaling
server所需的模块):

npm
install express

npm
install yetify

npm
install getconfig

npm
install node-uuid

npm
install socket.io

3.     从https://github.com/andyet/signalmaster下载信令server源代码,该信令server是SimpleWebRTC缺省使用的,解开该源代码后执行node server.js,该服务器监听8888port,通过WebSocket与浏览器通信。

4.     在同一台PC上执行apache server,将从http://conversat.io站点扒下来的文件放到该server上(可在Chrome浏览器中打开http://conversat.io然后鼠标右键单击在菜单中选“另存为”、“网页,所有”就可以),改动当中的 index.html 和 simplewebrtc.js,将当中 url 改为‘http://10.100.156.83:8888‘(当中IP地址是我的PC在公司局域网中的IP地址)。

5.     在同一局域网中的其它设备上打开Chrome浏览器,地址栏输入http://10.100.156.83,输入同样的room名称(随便起)就可以開始多方视频通信,也可改动上述index.html中的“var room”一行,设定为固定的room名称,就不须要每次在每一个设备上手工输入room名称了。

3.9   国内牛人开发的视频聊天室应用

这个demo是国内牛人赵书剑开发的视频聊天室,基于webrtc.io实现。

该项目源代码和文档下载地址是http://ishare.iask.sina.com.cn/f/35083616.html,源代码在https://github.com/zsj2145676

经改动后在本人公司局域网成功执行,试过两个手机和一个笔记本电脑同一时候视频通信OK。改动和执行步骤:

1.     从http://ishare.iask.sina.com.cn/f/35083616.html下载webrtc.chatdemo.zip,解压缩,改动当中public\javascripts\client.js中的rtc.connect一行,将实际的server地址写进去,比如改为:rtc.connect("ws://10.100.156.83:8001", room);

2.     同上文3.8节步骤1、2安装nodejs

3.     执行node app.js,注意该demo本身已包括http server,不须要其它的比方apache server

4.     在同一局域网中的其它设备上打开Chrome浏览器,地址栏输入http://10.100.156.83:8000,输入同样的room名称(随便起)就可以開始多方视频通信。

转自:http://blog.sina.com.cn/s/blog_69a04cf401016gz4.html

本人使用3.8在本地调试执行成功。

WebRTC学习笔记_Demo收集,布布扣,bubuko.com

时间: 2024-08-09 19:51:32

WebRTC学习笔记_Demo收集的相关文章

【安全牛学习笔记】收集敏感数据、隐藏痕迹

收集敏感数据.隐藏痕迹 利用配置不当提权 应用系统的配置文件 应用连接数据库的配置文件 基本信息收集 Linux /etc/resolv.conf /etc/passwd /etc/shadow whoami and who –a ifconfig -a, iptables -L -n, ifconfig –a, netstat –r uname –a, ps aux dpkg -l| head [email protected]:~# /etc/resolv.confDNS         

web安全学习笔记-手工收集信息

1.攻击目标:http://duwei19921019.vicp.cc:8881/ 信息收集的注意点: 网站是静态/动态 哪种脚本语言开发的 web服务器的类型 是否为cms,若是,cms的名称为? 是否开启了cdn 网站真实IP 是否有robots.txt文件 端口/服务器开放情况 2.随意点开一个图片链接,http://duwei19921019.vicp.cc:8881/affiche.php?ad_id=32&uri= 看到是php开发的动态网站. 3.随意输入一个不存在地址.http:

webrtc学习笔记1(建立连接基本流程)

最近在做一个基于webrtc的视频软件,以下是自己对于上层建立通话连接流程的基本理解,记录于此. 假设A和B要建立视频通话,A为房间创建端,B为加入房间端: 1.A通过http登录.获取其他服务器地址(做一些保存用户信息的操作,获取信令.stun.turn服务器地址等,非必要) 2.A和信令服务器建立websocket长连接 3.A通过websocket向信令服务器注册(创建房间,记录房间号,等待B加入房间) 4.A创建本地视频,获取A的sdp信息 5.B创建本地视频,获取B的sdp信息 6.B

JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和ArrayList.HashSet.LinkedList等等.根据核心框架图,相信我们都已经对Collection这个JavaSE中最常用API之一有一个较为全面的认识. 这个学习过程,还可以推及到其他常用开源框架和公司项目的学习和熟悉上面.借助开发工具或说明文档,先是对项目整体有一个宏观的认识,再根

LoadRunner学习笔记--未经排版

LoadRunner学习笔记 并发用户数量: 与服务器进行交互的在线用户数量 请求响应时间 从客户端发送请求到得到整个响应的时间 一般包括网络响应时间+server的响应时间 事务相应时间 完成这个事务所用的时间 是性能测试中重点关注的指标 吞吐率 单位时间在网络上传输的数据量(吞吐量:网络上传输的数据总量) 指从server返回客户端的 是衡量网络性能的主要指标 TPS 每秒钟系统能够处理事务的数量 点击率 每秒发送的HTTP请求的数量 点击率越大对server的压力也就越大 资源利用率 对不

[转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上,组成适合需求的Sharepoint搜索场,搜索场的体系结构设计主要参考量是爬网内容量,微软根据爬网内容量不同将搜索场分为大型场,中型场和小型场,更多详细信息可参考: SharePoint Server 2013 中的搜索概述和在SharePoint Server 2013 中规划企业搜索体系结构.

树莓派学习笔记——Model B Model B+ Compute Module Dev Kit的区别和联系

0 前言 最近浏览器树莓派官方发现树莓派推出了两款新Model--一款名为树莓派 model B+,一款名为树莓派 Compute Module Dev Kit.带着欣喜和恐惧查阅了相关资料,并通过淘宝和RS中国了解开发板价格.欣喜的感觉来自于树莓派的功能得到了增强,恐惧来自于树莓派的改变带来新的学习成本.经过几天的资料收集,所以整理成博文和大家分享. 1 横向比较 [共性比较] 表1 三款树莓派横向比较 区别 Model B Model B+ Compute Module Dev Kit 芯片

《深入Java虚拟机学习笔记》- 第7章 类型的生命周期

一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令,或者通过不明确的创建.反射.克隆和反序列化): 当调用某个类的静态方法时(即在字节码中执行invokestatic指令): 当使用某个类或接口的静态字段,或者对该字段赋值时(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式): 当调用Java API中的某些反射方法: 当初始化某个

【python学习笔记】6.抽象

[python学习笔记]6.抽象 创建函数: 使用def语句定义函数,不用声明参数类型,和返回值类型 def function_name(param1, param2): 'this is document' pass # fuction body return value # 可选 函数体的第一行字符串被用作文档字符串 callable(func): 用来判读func是否可以调用 help函数用来返回相关函数的文档 函数名可以作为变量赋值一个变量 位置参数:函数调用期间,参数按照参数列表中的顺