从 0 打造音视频直播系统
李超
前新东方音视频直播技术专家,前沪江音视频架构师
32579 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
WebRTC 1对1通话 (23讲)
从 0 打造音视频直播系统
15
15
1.0x
00:00/00:00
登录|注册

19 | WebRTC能不能进行文本聊天呢?

具体例子
实时文字聊天
事件处理
配置
SCTP协议
数据传输
Out-of-band协商方式
In-band协商方式
RTCDataChannel
参考
思考时间
文本聊天
WebRTC

该思维导图由 AI 生成,仅供参考

WebRTC 不但可以让你进行音视频通话,而且还可以用它传输普通的二进制数据,比如说可以利用它实现文本聊天、文件的传输等等。
WebRTC 的数据通道(RTCDataChannel)是专门用来传输除了音视频数据之外的任何数据,所以它的应用非常广泛,如实时文字聊天、文件传输、远程桌面、游戏控制、P2P 加速等都是它的应用场景。
像文本聊天、文件传输这类应用,大多数人能想到的通常是通过服务器中转数据的方案,但 WebRTC 则优先使用的是 P2P 方案,即两端之间直接传输数据,这样就大大减轻了服务器的压力。当然 WebRTC 也可以采用中继的方案,这就需要你根据自己的业务需要进行选择,非常灵活。

RTCDataChannel 介绍

RTCDataChannel 就是 WebRTC 中专门用来传输非音视频数据的类,它的设计模仿了 WebSocket 的实现,使用起来非常方便,关于这一点我将在下面的“RTCDataChannel 的事件” 部分向你做更详细的介绍。
另外,RTCDataChannel 支持的数据类型也非常多,包括:字符串、Blob、ArrayBuffer 以及 ArrayBufferView。
实际上,关于这几种类型的联系与区别我在前面《04 | 可以把采集到的音视频数据录制下来吗?》一文中已经向你做过详细的介绍,如果你现在记不清了,可以再去回顾一下。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

WebRTC不仅支持音视频通话,还能传输二进制数据,如文本聊天和文件传输。其数据通道(RTCDataChannel)可广泛应用于实时文字聊天、文件传输、远程桌面、游戏控制、P2P加速等场景。RTCDataChannel支持多种数据类型,如字符串、Blob、ArrayBuffer等。其传输协议为SCTP,可在可靠有序、不可靠无序、部分可靠模式下工作。创建RTCDataChannel对象需先创建RTCPeerConnection对象,再调用createDataChannel方法。配置RTCDataChannel对象时可指定消息传递是否有序、重传消息失败的最长时间等选项。RTCDataChannel的事件处理与WebSocket类似,包括打开、关闭、接收消息和出错。实时文字聊天可通过RTCDataChannel对象实现,可采用In-band协商和Out-of-band协商两种方式创建RTCDataChannel对象。文章还提供了具体例子,展示了如何通过RTCDataChannel对象实现实时文字聊天应用。RTCDataChannel的创建有两种方式,一种是默认的In-band协商方式,另一种是Out-of-band协商方式。在本文例子的实践部分,我们主要应用的是第一种方式。但一般情况下更推荐使用第二种方式,因为它更高效、更简洁。RTCDataChannel对象的创建要在媒体协商之前创建,否则WebRTC就会一直处于connecting状态,从而导致数据无法进行传输。RTCDataChannel对象是可以双向传输数据的,所以接收与发送使用一个RTCDataChannel对象即可,而不需要为发送和接收单独创建RTCDataChannel对象。SCTP协议是运行在UDP协议之上。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 打造音视频直播系统》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • Geek_c1c44a
    老师您好,请问zoom和直播技术相关吗?zoom可能使用什么协议呢?

    作者回复: zoom 是 Zoom 公司开发的一款直播软件,它底层也用的 地UDP 协议,他的老板袁征以前是 Webex 的高管。 Webex 是第一家在美国上市的,专门做音视频会议的公司。创建于 1996年,2000年左右在美国上市,后 2007年被cisco 公司收购。Webex出走的人很多都创业做音视频相关的事情,像国内的 声网都是 Webex的人创建的。

    2019-08-27
    7
  • 许童童
    SCTP 协议基于UDP,自行实现TCP相关的功能。

    作者回复: 赞!

    2019-08-27
    6
  • John
    这个问题好像应该问在这个章节: 如果做百人群聊的功能 不用中间服务器 只用webrtc技术和peerconnection 大家觉得普通带宽和手机能够承载么

    作者回复: 一路 640*420 的视频咱们估算是 500kbps, 那么 100 人同时与一个人通信就需要 100*500kbps, 也就是说需要 50M的带宽。而这 100 人的 NAT 类型千奇百怪。你想想这样做靠谱吗?

    2019-11-16
    2
    5
  • 三角形小于零
    "文本通过 RTCDataChannel 发送出去后,最终是经过 RTCPeerConnection 传送出去的" 之前提到过 RTCPeerConnection 可以理解为是一个功能超强的 socket,那么 DataChannel 的 SCTP 也是使用这个超强的 socket 来实现的吗? 如果需要 relay,那么 turn server 也会负责帮忙 relay 通信双方往 DataChannel 里发的数据吗?

    作者回复: 没错,都是由RTCPeerConnection发出去的。对于底层传输来说,它不关心你上层是什么,都走同样的物理链接。

    2020-11-22
    3
  • 宇宙之王
    看到您GitHub例子里面19_chat用了var pcConfig = { 'iceServers': [{ 'urls': 'turn:stun.al.learningrtc.cn:3478', 'credential': "mypasswd", 'username': "garrylea" }] }; 这段是不是没用,好像是您自己的服务器,我把它赋值空var pcConfig=null;也能正常运行。另外当开两个窗口的时候,有时会掉线一个,再连接服务器能连上,但是发送框就老是灰的了,就要两个都断掉重新再联了,这一般是什么原因,谢谢老师!

    作者回复: 应该是有BUG

    2020-09-19
    1
  • 老师,一个题外话,这么多可作后端的语言,c++、python、go、java、c#该如何选择了?

    作者回复: 信令服务器或者说业务服务器对性能要高不要的话使用 go/java 比较好。流媒体服务器由于对性能要求特别高,所以要使用 C/C++ 开发

    2019-08-28
    1
  • 木木
    SCTP是运行在UDP上的,本质上是对UDP的封装,在应用层实现了有序性与可靠性的配置。

    作者回复: 赞

    2019-08-27
    1
  • Bubbly
    var options = { key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'), cert: fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem') } 老师,这里的key和pem都没有呀

    作者回复: 这个需要你自己购买域名和证书,这个证书是我的,现在已经过期了。

    2020-10-23
  • cheese
    在create和join后,双方成功连接后,能否用Datachannel来传输信令呢?比如:关闭麦克风之类的

    作者回复: 可以,但有很大的局限性,你可以自己想想

    2020-04-09
  • Geek_5a0689
    老师,我的server.js在我部署的腾讯云服务器上跑起来了,但是在我本机的html页面请求的时候,没有任何反应,看服务器上的日志也是没有任何的打印,是什么原因呢?我直接跑的git上面的代码都不可以

    作者回复: 你购买了http 域名,申请了 https 证书吗?

    2020-03-19
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部