V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
bmpidev2019
V2EX  ›  分享创造

搭了一个 WebRTC 语音聊天室,效果惊人

  •  7
     
  •   bmpidev2019 · 121 天前 · 13442 次点击
    这是一个创建于 121 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搭建了一个基于 WebRTC 技术的语音聊天室。测试了下和一个沙特阿拉伯人聊了一个小时,出奇的稳定,语音质量也很好,和国内的人聊也都很稳定,不比 zoom 与微信差。

    比 App 的优势好在无需注册,分享房间链接,用浏览器打开即可聊天,用完一切就消失了,隐私性好。

    测试地址: https://free4.chat/

    开源仓库地址: https://github.com/madawei2699/free4chat

    此网站是后端基于 kraken,它本身又基于 Go 语言中 pion 这个 WebRTC 的库,前端基于 Mornin,我把搭建的操作流程都放入了项目中的 infra 目录中,如果你要自己搭建的话,可以参考。

    不过目前的功能只是我想要的一部分,所以后续可能会添加一些功能,目前想到的有这些:

    • Room
      • Text chat, can sent text or emoji
      • Room permission setting, like public/private type setting
      • Public rooms discovery, like hot room list or filter rooms by type/tag
    • User
      • Robot user, like game robot who can play or facilitate game
      • User real-time collaboration, like whiteboard
    • Infra
      • Backend service cluster, auto scaling, load balancing, etc.
      • Security enhancement, like coturn TLS setup, end-to-end encryption, etc.

    如果你对 webRTC, peer-to-peer(P2P), real-time collaboration(CRDT), distributed system 或 robot design 感兴趣,欢迎关注或参与进来。

    说效果惊人是,测试了一天,语音通话质量出奇的好,因为一个房间大多不到十个人,语音通话质量不仅稳定而且不比 zoom 、腾讯会议、微信等差(个人及测试的人感觉)。

    另外一个有意思的是服务器,后端服务包括 coturn 都部署到一台 1 核、1G 内存的 AWS 服务器上。目前测试的效果是服务器毫无压力,甚至可以降级到 512M 内存的机器。

    最终昨天大概有近一千人访问,创建了上千个房间,服务器始终负载没怎么变化,可能这就是 P2P 的优势吧。

    79 条回复    2022-03-09 16:32:15 +08:00
    mywaiting
        1
    mywaiting  
       121 天前
    这货是不是双方建立连接后,就直接点对点通信了?不用通过服务器中转负载肯定低
    cat9life
        2
    cat9life  
       121 天前
    这个牛 x 能做 ppt 演示吗
    bmpidev2019
        3
    bmpidev2019  
    OP
       121 天前
    @mywaiting 服务器是 SFU 的,并且 coturn 也开启了 turn ,在糟糕的情况下,所有 peer 都需要服务器中转才行,所以也不能直接说全部就直连了
    bmpidev2019
        4
    bmpidev2019  
    OP
       121 天前
    @cat9life 目前只有语音,你说的这种在线会议就可以,有很多开源的框架可以弄
    sunwei0325
        5
    sunwei0325  
       121 天前
    @cat9life https://meet.jit.si/ 这个可以共享屏幕
    santom
        6
    santom  
       121 天前
    之前 RTC 做过一阵大直播,这个延迟怎么样?
    tanhui2333
        7
    tanhui2333  
       121 天前
    以前做过基于 kurento 的,确实还行。不过不是音视频流媒体行业的,深度搞起来有点吃力。
    cat9life
        8
    cat9life  
       121 天前
    @sunwei0325 谢谢
    keith1126
        9
    keith1126  
       121 天前
    > 不比 zoom 与微信差

    前半句应该有点夸张了……只能说网络状况良好的情况下,怎么实现都差不多。
    5sheep
        10
    5sheep  
       121 天前
    这个 WebRTC 多年前就已经有很成熟的开源应用了。 楼主再次从头开始,是啥想法呢? 练技术?
    bmpidev2019
        11
    bmpidev2019  
    OP
       121 天前 via iPhone   ❤️ 1
    @keith1126 和沙特阿拉伯那边聊了一小时多,其中也有国内深圳、珠海、云南、陕西的人进来,我持续测试了一天,因为我们工作也在用 zoom (在家办公,一挂一整天),我对比在同样的网络环境下,感觉就是比 zoom 要好一些,当然环境的问题很复杂,但测试的感受就是这样的
    lloovve
        12
    lloovve  
       121 天前 via iPhone
    一对一能理解点对点通信,多个人的房间怎么点对点?
    bmpidev2019
        13
    bmpidev2019  
    OP
       121 天前 via iPhone
    @5sheep 通过一个产品去持续练技术,就当技术实验田吧,当然 webRTC 也一直在发展,不能说已经成熟到不变的地步了,还有其他技术可以玩,甚至可以在技术上找一些好的场景,比如在线会议已经很成熟了,那这个产品只能走极端,比如在语音中找一些玩法、场景,找需求点(比如语言学习等场景),这些都是一些可尝试的点,并不是重复造轮子
    bmpidev2019
        14
    bmpidev2019  
    OP
       121 天前
    @lloovve SFU 并不是用户与用户的连接,而是这种模式 https://excalidraw.com/#json=2AAmNFc0WMiDurA5ejiB4,Hjs5fMMQh5ollETmhfgWWw
    okakuyang
        15
    okakuyang  
       121 天前
    这个肯定都是全部流量转发的,就国内网络环境不可能穿透成功的。
    bmpidev2019
        16
    bmpidev2019  
    OP
       121 天前 via iPhone
    @okakuyang 如果是全部中转了,那按目前的采样率数据还挺小的,实时在线 20 多人,服务器网络流量每秒才 30-40KB (上行与下行都差不多这个范围)
    LiuJiang
        17
    LiuJiang  
       121 天前
    webRTC 在国内安卓机上有很大的兼容性问题
    legendORld
        18
    legendORld  
       121 天前
    刚才和同事试了一下,效果还行,就是不知道长时间会不会发热
    Zeonjl
        19
    Zeonjl  
       121 天前 via iPhone
    国内直连就是牛!
    cweijan
        20
    cweijan  
       121 天前
    去年搭建开源平台 jitsimeet, 和你这个一样, 不过它支持视频, 但是安装太繁琐了, 你这个看起来很轻量
    FightPig
        21
    FightPig  
       121 天前
    这个可以,正好学习下
    bmpidev2019
        22
    bmpidev2019  
    OP
       121 天前 via iPhone
    @LiuJiang 安卓的新版本 chrome 应该还行
    @legendORld 我 iPhone 聊了一整天,没怎么发热
    @cweijan 这个安装花了我一整天时间,主要是有一些小坑,但 c++开发的那些库功能很齐全,搞起来可能很复杂,go 这个代码也挺简单的
    LiuJiang
        23
    LiuJiang  
       121 天前
    @bmpidev2019 国内大部分手机厂商默认的浏览器,都不是 Chrome
    Borden
        24
    Borden  
       120 天前
    这种东西,技术问题都不是问题~
    Funnyang
        25
    Funnyang  
       120 天前 via iPhone
    可以支持视频通话么,微信会发热
    Akagi201
        26
    Akagi201  
       120 天前
    感谢分享, 有兴趣研究下 webrtc.rs 吗? 期待 lz 实验. 之前做这行, 现在不做了. 还是有兴趣在.
    EPr2hh6LADQWqRVH
        27
    EPr2hh6LADQWqRVH  
       120 天前
    语音的话确实,毕竟以前像 erlang 这种,目标都是语音业务,恨不得一台机器管一个市
    ferock
        28
    ferock  
       120 天前 via Android
    支持 docker 部署吗
    XTTX
        29
    XTTX  
       120 天前
    国内和国内两点中专延迟高吗? 声网这种语音 api, 更大的价值还在让云服务器更靠近终端用户,实现稳定和低延迟。不过他们的收费也是高得离谱。
    XTTX
        30
    XTTX  
       120 天前
    还有,如果要加入更完整的 IM 功能,我建议是扒一扒类似 mattermost 的开源前端, 类似 slack 的功能它都有, 不过就是要用到 react 和 redux.
    XTTX
        31
    XTTX  
       120 天前
    后台支持 singaling 和中转两种模式吗?
    XTTX
        32
    XTTX  
       120 天前
    国内的话,STUN 服务器怎么解决?
    Biwood
        33
    Biwood  
       120 天前
    流量还是得转发吧,能做到 P2P 直连吗
    bmpidev2019
        34
    bmpidev2019  
    OP
       120 天前 via iPhone   ❤️ 1
    @Funnyang 不支持,主要是语音,未来可能加文字,全功能的应用用 App 就好了,这个工具主要是简单
    @Akagi201 rust 比 go 太复杂了,玩不了
    @avastms erlang 的确更合适,但是还是语言和生态的问题,没选择
    @ferock 不支持 docker ,主要是端口通信的问题,服务器端需要很大一个 udp 和 tcp 端口范围用来和客户端建立 p2p ,docker 有点麻烦
    @XTTX 目前 server 实现了 turn ( coturn ),signal 的功能,也包括用户 token 生成(访问 turn )。turn 本身就可以做 stun 的功能,turn 就是中转( relay )。功能不想做的太复杂,主要是基于语音找一些场景应用。
    @Biwood p2p 直连在用户多的时候客户端负载太大了(指数关系),服务器目前是 sfu 架构,客户端直连服务器,服务器中转,这样 p2p 连接数只和用户数成线性
    XTTX
        35
    XTTX  
       120 天前
    @bmpidev2019 #34 语音的话可以参考一下声网,即构这种实时语音的 sdk 提供商。 收费帮他们搭建服务,或者提供便宜的计时收费的语音包
    qq316107934
        36
    qq316107934  
       120 天前
    支持 ipv6 吗,支持的话估计都不用中转
    darkengine
        37
    darkengine  
       120 天前
    哦吼,这个有意思
    darkengine
        38
    darkengine  
       120 天前
    https://free4.chat/StoneX

    有人来聊吗
    HXM
        39
    HXM  
       120 天前
    和在 LA 的同学试了一下,效果确实不错,好奇 SFU 服务器搭建在哪里?

    另外要是支持语音降噪之类的功能就更好了 现在可以明显听到对方敲键盘的声音
    Chism
        40
    Chism  
       120 天前
    直接搭建一个全球陌生人随机视频可行?
    bmpidev2019
        41
    bmpidev2019  
    OP
       120 天前 via iPhone
    @qq316107934 ipv6 应该不支持吧,不知道底层的 pion 是否支持
    @HXM 服务器在新加坡,降噪得靠耳机和麦了,浏览器做降噪的方案不知道有没有
    @Chism 一对一聊天可以用这种模式,类似于游戏里组队 pk😂
    ugpass
        42
    ugpass  
       120 天前
    关注下~
    04huang
        43
    04huang  
       120 天前
    能否出一个更加具体的搭建教程。。TLS/SSL 那部分不是太明白 [不太想用 CDN] ,后面倒是没啥问题。。
    silerLee
        44
    silerLee  
       120 天前
    简洁又好看. 很有意思的东西
    over140
        45
    over140  
       120 天前   ❤️ 1
    不错,这个 Mornin 也是我们团队和 Fox 团队一起弄的,欢迎大佬来 Mixin 搞开发~~~
    bmpidev2019
        46
    bmpidev2019  
    OP
       120 天前 via iPhone
    @over140 大佬现身了,我只是用你们开源的搭建了这个网站,感谢你们的开源精神👍期望之后能给你们贡献代码😄
    hanguofu
        47
    hanguofu  
       120 天前 via Android
    谢谢分享!期待加上 Room 的功能。
    Bastionbee
        48
    Bastionbee  
       120 天前
    刚刚试了一下,在 se2 上用 Safari 中打开,可以进行后台语言,发热量很小,延迟比微信低
    mayli
        49
    mayli  
       120 天前 via Android
    我记得 webtrc 有个 demo 就是这个?
    https://webrtc.github.io/samples/src/content/peerconnection/audio/
    N032138
        50
    N032138  
       120 天前
    期待一个能使用的 docker 镜像
    XTTX
        51
    XTTX  
       120 天前
    terraform+ ansible + docker 可以做成商用版,付费自动帮忙部署。 只要语音成本低,应该有市场的。我以前了解过一些语音 sdk 商, 价格 1000 分钟, 4 到 7 块。 双向收费,3 人通讯要收两份钱。
    bmpidev2019
        52
    bmpidev2019  
    OP
       120 天前 via iPhone
    @XTTX 没想到这都可以商业化,实际上这个技术挺成熟的,费用也没那么高,不知道为啥收费这么贵,我这服务器全部费用也才 5 美刀一个月,能支持 100 多个人实时通话应该没问题
    bmpidev2019
        53
    bmpidev2019  
    OP
       120 天前 via iPhone
    @XTTX 一开始我就准备用 IaC 部署的,后来因为觉得没必要,就一台服务器手工部署半天搞定(熟练估计半小时搞定),所以只是记录了操作指南
    XTTX
        54
    XTTX  
       119 天前
    @bmpidev2019 #52 国内能用上实时语音的不是游戏就是社交类 app 或者 saas, 估计 sdk 厂商都觉得这类客户钱多,可以挤。

    声网去年因为提供 Clubhouse 语音 sdk, 股价一度到了 100+美金。
    他们需要到处部署节点,让节点离终端消费者更近。收费高,但是这样还是连续亏损。 他们收购环信,IM sdk 商。
    我以前完全不懂技术的时候,觉得即时通讯+实时语音是多么高深的技术。 可能外行人也这么觉得,所以愿意高额支付 sdk.

    我几年前想搞一个 IM 产品,所以对这些 sdk 商有一点了解。 他们的 IM 消息是按条计算的, 因为法律要求, 需要在服务器上存留一定时间。

    除了按使用量收费,我觉得一次性付费部署还是有市场的,因为很多初创项目根本支付不了那么高昂的费用,也不需要极致的延迟。

    ========================================

    “从财报来看,该公司收入成本在增加。2021 年第三季度,声网收入成本为 1570 万美元,比去年同期的 1160 万美元增长了 35.5 %,主要原因是随着公司扩大业务规模,带宽和协同部署成本增加,以及服务器和网络设备的折旧。此外,2021 年第三季度,声网在 2021 年第三季度的运营费用为 5040 万美元,较上年同期的 2320 万美元增长 116.9%。”
    bmpidev2019
        55
    bmpidev2019  
    OP
       119 天前 via iPhone   ❤️ 1
    @XTTX 语音要存储的确会导致成本飙升,还有审核的问题,我这个站很简单不需要考虑这些,也没有存储,如果做 sdk 肯定有很多别的要求,但只是做实时语音通讯技术倒不复杂(底层还是挺复杂的,但技术已经发展了十多年来,现在比较成熟)
    XTTX
        56
    XTTX  
       119 天前
    @bmpidev2019 #55 语音不需要需要存储,文本的消息需要存一个星期吧。 隔行如隔山,我几年前还花了几千块“咨询”一个所谓的专家,问这块技术门槛高不高。他说高得很,建议用付费 sdk. 就没了。。。。

    真是谢谢你。 等我把前端搞完,好好研究一下。
    bmpidev2019
        57
    bmpidev2019  
    OP
       119 天前 via iPhone
    @XTTX 有没有研究过相关法律法规?服务器在国外的话需要遵循哪些条款?
    lqzhgood
        58
    lqzhgood  
       119 天前
    问问群聊的 p2p 怎么实现的? 单人的数据全部发给其他人么?
    bmpidev2019
        59
    bmpidev2019  
    OP
       119 天前 via iPhone
    @lqzhgood 你查查 sfu
    XTTX
        60
    XTTX  
       119 天前   ❤️ 1
    @bmpidev2019 #57 国内公司需要 ICP 证,国外管不了。 香港也不用。 以前研究过, 有专门办理这种证的中介,几千到万元不等。 办公司才需要这些证。
    steptodream
        61
    steptodream  
       119 天前
    要是支持视频就好了,可以拿来改改给公司用。
    WLW
        62
    WLW  
       119 天前
    @steptodream 同关注支持视频的会议室,有找到好用的,麻烦顺带通知一声,谢谢!~
    bmpidev2019
        63
    bmpidev2019  
    OP
       119 天前
    @steptodream
    @WLW

    公司视频会议有很多系统方案可以用,公司的需求也很复杂,视频、桌面分享、权限管理、录屏啥的,还不如直接用商业方案好了
    WLW
        64
    WLW  
       119 天前
    @bmpidev2019 最初级的能视频对话就好,权限方面指定账号才能创建 room ,
    不用分享桌面(或简单粗暴的摄像头拍另一个屏幕 ^.^ ) ,不用录屏(或同上,哈哈)。
    这不是疫情吗,外贸客户不能过来,很多就需要视频对话验货了,
    然后老外习惯用的平台,大部分被墙,或者注册账号麻烦。
    方便的话,给点关键字,我先搜搜看
    bmpidev2019
        65
    bmpidev2019  
    OP
       119 天前 via iPhone
    @WLW 随便找个视频会议在线的网站就可以
    k9982874
        66
    k9982874  
       118 天前
    没被盯上之前都很流畅,一但被盯上就是各种卡顿失联。
    PrtScScrLk
        67
    PrtScScrLk  
       117 天前
    老哥你这个服务器性能监控用的是什么,界面还挺好看的。
    bmpidev2019
        68
    bmpidev2019  
    OP
       117 天前 via iPhone
    @PrtScScrLk servercat
    dany813
        69
    dany813  
       114 天前
    很强啊
    rapiz
        70
    rapiz  
       109 天前
    我读了一下 SFU 的描述,这个意思不是所有流量都经服务器中转吗?只是编码和解码在客户端做。希望 OP 解惑
    bmpidev2019
        71
    bmpidev2019  
    OP
       109 天前 via iPhone
    @rapiz 我的理解是相当于每个 peer 都和服务器建立 peer 连接了,服务器会对房间里的 peer 的音频 track 做转发。如果不用 sfu ,光是 p2p 这种,客户端每次需要发送 n-1 条音频给其他 peer ,但现在只需要发给服务器一次就可以了
    RickyC
        72
    RickyC  
       99 天前
    好像真的很惊人的样子。
    wsseo
        73
    wsseo  
       99 天前
    腾讯搞了一个 echo
    GitContract
        74
    GitContract  
       98 天前
    lz 拉个群呗
    nathanw
        75
    nathanw  
       88 天前
    超过百人的会议,webrtc 貌似不如 zoom
    liuxyon
        76
    liuxyon  
       88 天前 via Android
    上个支持 ipv6 的吧?另外如果网络本身延迟大,例如 200-400 多 ms 情况下 效果是怎么样的?
    bmpidev2019
        77
    bmpidev2019  
    OP
       88 天前 via iPhone
    @nathanw 和架构还有服务器硬件有关系,比如专用的 MCU 这种硬件,目前 free4.chat 是 sfu 架构,服务器性能要强的话,单机支持百人规模会议也可以,但再多客户端可能扛不住(百人规模客户端是 1 路上行+99 路下行,客户端网络负载高,这种需要高性能的 MCU 这种硬件方案了),zoom 毕竟是企业级服务,有好的软件+硬件方案自然效果更好一些
    bmpidev2019
        78
    bmpidev2019  
    OP
       88 天前 via iPhone
    @liuxyon 支持 ipv6 有啥用呢?目前底层用的库 pion 好像都不支持 ipv6 啊,网络延迟高这情况我还没测试
    daimaosix
        79
    daimaosix  
       69 天前
    @bmpidev2019 大佬,我始终没看明白你仓库的配置文档怎么回事,按照你流程走的,看着也不复杂,跑起来访问 7000 端口显示:{"error":"not found"}
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3250 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:16 · PVG 12:16 · LAX 21:16 · JFK 00:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.