WebRTC

什么是WebRTC

webRtc(web real-time Communication) ,旨在建立一个浏览器间实时通信的平台

  • 谷歌开源
  • 跨平台(android,IOS,windows,Linux)
  • 实时传输(提供强大的音视频引擎)

RTC涉及的流程及内容

采集->编码->传输->解码->渲染

采集:捕获摄像头、麦克风设备数据(yuv,pcm)

编码:将yuv、pcm格式数据编码(h264、vp8、opus、aac)

传输:将编码后的桢数据打包传输,应对弱网环境(QOS),RTP/RTCP协议传输数据

解码:将编码后的数据解码成yuv/pcm数据

渲染:将解码后的数据展示到渲染窗口

WebRTC架构

架构.png

架构说明:

your web app:是你的应用程序通过Web Api方式实现的音视频程序。

Web Api: 在C++的API层封装了一次WebAPI 的WEBRTC接口给上层应用调用。

WEBRTC C++ API:暴露C++封装的WEBRTC真实实现。

Session Manager:会话层,用于接收会话信息和结束会话信息。

Voice Engine:音频引擎编解码。

Video Engine:视频引擎编解码

Transport:数据传输引擎。

WebRTC通信流程图

webrtc通信流程图.png

描述:

1.客户端A要与客户端B通信,需要连接信令服务。

2.客户端A要与客户端B通信,需要连接STUN/TURN服务器做NAT转发IP转换。

3.客户端A要与客户端B通信,需要通过信令服务将两者NAT转发IP做交换。

4.两者媒体协商成功,就可以音视频通信。

WebRTC API 枚举音视频设备

//功能说明:枚举音视频设备
//返回说明:描述设备的MediaDeviceInfo数组
var promise= navigator.mediaDevices.enumerateDevices();
//示例文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices
//注意事项:
// 1.如果需要获取音视频枚举必须给浏览器设备允许获取音频或视频设备信息。
// 2.如果项目发布到互联网中需要使用HTTPS协议

WebRTC API 采集音视频设备数据

//功能说明:采集音视频设备数据
//参数说明:paramters
var promise = navigator.mediaDevices.getUserMedia(constaints);
//示例文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
//注意事项:获取音视频数据需要用<video></video><audio></audio>标签播放

WebRTC API 采集桌面窗口数据

//功能说明:采集桌面数据
//参数说明:paramters
var promise= navigator.mediaDevices.getDisplayMedia(constaints);
//示例文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getDisplayMedia

WebRTC API 适配

  • WebRTC标准推出之前,各大浏览器厂商使用自己对WebRTC规范支持API不一致

  • 例如:

    • 谷歌:webkitGetUserMedia
    • 火狐:mozGetUserMedia
  • 如果用户自行编写适配不同浏览器的应用层程序,如下所示

    • var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
  • 兼容不同浏览器API的适配程序

  • <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

MediaStream

播放音视频返回的是MediaStream对象,MediaStream用于表示媒体内容,它包含了一系列音视频轨道(MediaStream API)

构造方式:getUserMedia / getDisplayMedia / new MediaStream();

主要方法:

MediaStream.addTrack();

MediaStream.getTrack() / MediaStream.getAudioTracks() / MediaStream.getVideoTracks()

https://developer.mozilla.org/zh-CN/docs/Web/API/MediaStream

MediaStreamTrack

MediaStreamTrack表示一个具体的音视频轨道,例如音频轨道,适配轨道

重要数据:

MediaStreamTrack.id

MediaStreamTrack.kind

MediaStreamTrack.label

重要方法:

MediaStreamTrack.getConstraints() 获取轨道约束

MediaStreamTrack.getSettings() 获取轨道当前设置属性

https://developer.mozilla.org/zh-CN/docs/Web/API/MediaStreamTrack

RTCPeerConnection

概念:RTCPeerConnection 用于表示一个与远程的对等连接

构造方式:var pc = new RTCPeerConnection([configuration])

媒体协商的主要方式:

AddTrack:将音视频轨道添加到RTCPeerConnection,这些轨道将发送到对端

createOffer / createAnswer: 生成offer /answer SDP信息

setLocalDescription/setRemoteDescription :将SDP描述信息设置RTCPeerConnection 的本地/远程描述信息

...其他方法后续补充

https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection

媒体协商

问题:什么是媒体协商,为什么要进行媒体协商?媒体协商包含了哪些信息?

媒体协商.png

Amy和Bob要进行音视频通话

Amy采集摄像头/麦克风数据,进行编码,打包,然后通过网络输出Bob

Bob接收媒体包数据后需要组桢,解码,渲染

双方需要协商使用的编解码器,编解码器的具体参数,通过包含了哪些媒体信息,媒体怎么区分等

https://blog.csdn.net/Chiang2018/article/details/122741850

媒体协商流程

媒体协商流程.png

媒体协商SDP协议格式

https://blog.csdn.net/weixin_38102771/article/details/121259974?spm=1001.2014.3001.5501

WebRTC 网络穿越

思考:两个WebRTC客户端怎么实现端到端通讯?

  • 场景1:客户端A和客户端B都处于公网

  • 场景2:客户端A和客户端B有一方处于公网,另外一方处于内外(NAT之后)

  • 场景3:客户端A和客户端B处于内外

    • A:同一内部网络
    • B:不同内部网络

NAT(NETWORK Address Translator)

什么是NAT?

网络地址转换,负责将内外地址转换公网地址的互相转换

为什么需要NAT?

IPV4地址不够

网络安全考虑
nat转换.png

NAT类型

nat类型.png

P2P穿越

p2p打动.png
p2p打动1.png
p2p打动2.png
p2p打动3.png

WebRTC打动地址

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

STUN协议说明

https://blog.csdn.net/weixin_38102771/article/details/124069029?spm=1001.2014.3001.5502

TURN协议说明

https://blog.csdn.net/weixin_38102771/article/details/124530900?spm=1001.2014.3001.5502

使用coturn搭建STUN/TURN服务器

sudo apt-get update
sudo apt-get install coturn

#修改/etc/turnserver.conf文件的配置,如下
listening-port=3478
external-ip=公网服务器外网ip
lt-cred-mech
user=username1:password1
realm=mycompany.org

#启动
turnserver-c /etc/turnserver.conf

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

RTC协议

https://blog.csdn.net/weixin_38102771/article/details/121917634

ICE

ICE:交互式连接建立(Interactive Connectivity Establishment)

1.收集候选地址

2.交互候选项

3.STUN 连接检查

4.选定地址并启动媒体

5.KeepAlive

收集候选地址既收集本端或许可用于接收媒体以建立起对等连接的IP地址和端口



候选地址分类:

1.主机候选者(host):网卡的实际地址

2.服务器反射候选者(srflx):STUN服务器恢复STUN binding success response 中的反射地址,最后外层NAT的地址

3.中续候选者(relay):请求turn服务器的中续地址

4.对端反射候选者(prflx):从对端发送的STUN binding request中获取传输地址,本端无法收集到该类型候选地址。
iec.png

RTCPeerConnection收集并交换候选者

RTCPeerConnection收集并交换候选者
事件: icecandidate
发生时机: RTCPeerConnection调用setLocalDescription之后
处理方式: rtcPeerConnection.onicecandidate =(event)=>{
if(event.candidate){
//将本地候选者发送给对端
}else {
//表示在本地协商中没有更多的候选者了

}

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/icecandidate_event

RTCPeerConnection收集并交换候选者


接收到对端候选者后的处理方式addlcecandidate
语法: addlceCandidate(candidate)
参数: candidate 类型是RTCIceCandidatelnit,包含 candidate, sdpMid, sdpMLinelndex, usernameFragment 成
https://developer.mozillaorg/en-US/docs/Web/API/RTCIceCandidate/RTCIceCandidate

RTCPeerConnection ontrack

事件:ontrack
发生时机:收到对端的媒体轨道
处理方式:将MediaStreamTrack添加到MediaStream,将MediaStream赋值给<video>展示出对端的媒体画面
var remoteMs =new MediaStream();
rtcPeerConnection.ontrack =(event)=> (
       remoteMs.addTrack(event.track);
        videoElement.srcObiect =remotes

}

RTCPeerConnection构造参数说明明

构造方式: 
var pc= new RTCPeerConnection([configuration]);
interface RTCConfiguration {
bundlePolicy?:RTCBundlePolicy;
certificates?:RTCCertificatell;
iceCandidatePoolSize?:number;
iceServers?:RTCIceServerl];
iceTransportPolicy?:RTCIceTransportPolicy;rtcpMuxPolicy?:RTCRtcpMuxPolicy;

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection

信令服务器

信令服务器.png
信令服务器1.png

笔记来源

https://www.bilibili.com/video/BV1Zz4y137Un?p=20&vd_source=d754ed76ce303daef624fa3764425cd2

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

推荐阅读更多精彩内容