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

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

  •  8
     
  •   bmpidev2019 ·
    madawei2699 · 2022-01-17 09:15:10 +08:00 · 19588 次点击
    这是一个创建于 1040 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搭建了一个基于 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 的优势吧。

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

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

    有人来聊吗
    HXM
        39
    HXM  
       2022-01-17 17:14:07 +08:00
    和在 LA 的同学试了一下,效果确实不错,好奇 SFU 服务器搭建在哪里?

    另外要是支持语音降噪之类的功能就更好了 现在可以明显听到对方敲键盘的声音
    Chism
        40
    Chism  
       2022-01-17 17:35:13 +08:00
    直接搭建一个全球陌生人随机视频可行?
    bmpidev2019
        41
    bmpidev2019  
    OP
       2022-01-17 18:05:33 +08:00 via iPhone
    @qq316107934 ipv6 应该不支持吧,不知道底层的 pion 是否支持
    @HXM 服务器在新加坡,降噪得靠耳机和麦了,浏览器做降噪的方案不知道有没有
    @Chism 一对一聊天可以用这种模式,类似于游戏里组队 pk😂
    ugpass
        42
    ugpass  
       2022-01-17 18:33:29 +08:00
    关注下~
    04huang
        43
    04huang  
       2022-01-17 20:32:50 +08:00
    能否出一个更加具体的搭建教程。。TLS/SSL 那部分不是太明白 [不太想用 CDN] ,后面倒是没啥问题。。
    silerLee
        44
    silerLee  
       2022-01-17 20:43:10 +08:00
    简洁又好看. 很有意思的东西
    over140
        45
    over140  
       2022-01-17 21:26:36 +08:00   ❤️ 1
    不错,这个 Mornin 也是我们团队和 Fox 团队一起弄的,欢迎大佬来 Mixin 搞开发~~~
    bmpidev2019
        46
    bmpidev2019  
    OP
       2022-01-17 21:33:29 +08:00 via iPhone
    @over140 大佬现身了,我只是用你们开源的搭建了这个网站,感谢你们的开源精神👍期望之后能给你们贡献代码😄
    hanguofu
        47
    hanguofu  
       2022-01-17 23:51:22 +08:00 via Android
    谢谢分享!期待加上 Room 的功能。
    Bastionbee
        48
    Bastionbee  
       2022-01-18 00:13:42 +08:00
    刚刚试了一下,在 se2 上用 Safari 中打开,可以进行后台语言,发热量很小,延迟比微信低
    mayli
        49
    mayli  
       2022-01-18 04:28:12 +08:00 via Android
    我记得 webtrc 有个 demo 就是这个?
    https://webrtc.github.io/samples/src/content/peerconnection/audio/
    N032138
        50
    N032138  
       2022-01-18 09:00:40 +08:00
    期待一个能使用的 docker 镜像
    XTTX
        51
    XTTX  
       2022-01-18 10:35:56 +08:00
    terraform+ ansible + docker 可以做成商用版,付费自动帮忙部署。 只要语音成本低,应该有市场的。我以前了解过一些语音 sdk 商, 价格 1000 分钟, 4 到 7 块。 双向收费,3 人通讯要收两份钱。
    bmpidev2019
        52
    bmpidev2019  
    OP
       2022-01-18 11:53:48 +08:00 via iPhone
    @XTTX 没想到这都可以商业化,实际上这个技术挺成熟的,费用也没那么高,不知道为啥收费这么贵,我这服务器全部费用也才 5 美刀一个月,能支持 100 多个人实时通话应该没问题
    bmpidev2019
        53
    bmpidev2019  
    OP
       2022-01-18 11:55:16 +08:00 via iPhone
    @XTTX 一开始我就准备用 IaC 部署的,后来因为觉得没必要,就一台服务器手工部署半天搞定(熟练估计半小时搞定),所以只是记录了操作指南
    XTTX
        54
    XTTX  
       2022-01-18 12:33:41 +08:00
    @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
       2022-01-18 12:51:34 +08:00 via iPhone   ❤️ 1
    @XTTX 语音要存储的确会导致成本飙升,还有审核的问题,我这个站很简单不需要考虑这些,也没有存储,如果做 sdk 肯定有很多别的要求,但只是做实时语音通讯技术倒不复杂(底层还是挺复杂的,但技术已经发展了十多年来,现在比较成熟)
    XTTX
        56
    XTTX  
       2022-01-18 13:49:43 +08:00
    @bmpidev2019 #55 语音不需要需要存储,文本的消息需要存一个星期吧。 隔行如隔山,我几年前还花了几千块“咨询”一个所谓的专家,问这块技术门槛高不高。他说高得很,建议用付费 sdk. 就没了。。。。

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

    公司视频会议有很多系统方案可以用,公司的需求也很复杂,视频、桌面分享、权限管理、录屏啥的,还不如直接用商业方案好了
    WLW
        64
    WLW  
       2022-01-19 09:34:03 +08:00
    @bmpidev2019 最初级的能视频对话就好,权限方面指定账号才能创建 room ,
    不用分享桌面(或简单粗暴的摄像头拍另一个屏幕 ^.^ ) ,不用录屏(或同上,哈哈)。
    这不是疫情吗,外贸客户不能过来,很多就需要视频对话验货了,
    然后老外习惯用的平台,大部分被墙,或者注册账号麻烦。
    方便的话,给点关键字,我先搜搜看
    bmpidev2019
        65
    bmpidev2019  
    OP
       2022-01-19 10:02:42 +08:00 via iPhone
    @WLW 随便找个视频会议在线的网站就可以
    k9982874
        66
    k9982874  
       2022-01-20 08:57:23 +08:00
    没被盯上之前都很流畅,一但被盯上就是各种卡顿失联。
    PrtScScrLk
        67
    PrtScScrLk  
       2022-01-21 10:42:29 +08:00
    老哥你这个服务器性能监控用的是什么,界面还挺好看的。
    bmpidev2019
        68
    bmpidev2019  
    OP
       2022-01-21 12:02:44 +08:00 via iPhone
    @PrtScScrLk servercat
    dany813
        69
    dany813  
       2022-01-23 21:00:09 +08:00
    很强啊
    rapiz
        70
    rapiz  
       2022-01-28 15:36:43 +08:00
    我读了一下 SFU 的描述,这个意思不是所有流量都经服务器中转吗?只是编码和解码在客户端做。希望 OP 解惑
    bmpidev2019
        71
    bmpidev2019  
    OP
       2022-01-28 21:07:39 +08:00 via iPhone
    @rapiz 我的理解是相当于每个 peer 都和服务器建立 peer 连接了,服务器会对房间里的 peer 的音频 track 做转发。如果不用 sfu ,光是 p2p 这种,客户端每次需要发送 n-1 条音频给其他 peer ,但现在只需要发给服务器一次就可以了
    RickyC
        72
    RickyC  
       2022-02-07 14:39:10 +08:00
    好像真的很惊人的样子。
    wsseo
        73
    wsseo  
       2022-02-07 15:48:18 +08:00
    腾讯搞了一个 echo
    GitContract
        74
    GitContract  
       2022-02-08 15:16:42 +08:00
    lz 拉个群呗
    nathanw
        75
    nathanw  
       2022-02-19 09:13:43 +08:00
    超过百人的会议,webrtc 貌似不如 zoom
    liuxyon
        76
    liuxyon  
       2022-02-19 09:14:04 +08:00 via Android
    上个支持 ipv6 的吧?另外如果网络本身延迟大,例如 200-400 多 ms 情况下 效果是怎么样的?
    bmpidev2019
        77
    bmpidev2019  
    OP
       2022-02-19 09:40:55 +08:00 via iPhone
    @nathanw 和架构还有服务器硬件有关系,比如专用的 MCU 这种硬件,目前 free4.chat 是 sfu 架构,服务器性能要强的话,单机支持百人规模会议也可以,但再多客户端可能扛不住(百人规模客户端是 1 路上行+99 路下行,客户端网络负载高,这种需要高性能的 MCU 这种硬件方案了),zoom 毕竟是企业级服务,有好的软件+硬件方案自然效果更好一些
    bmpidev2019
        78
    bmpidev2019  
    OP
       2022-02-19 09:41:52 +08:00 via iPhone
    @liuxyon 支持 ipv6 有啥用呢?目前底层用的库 pion 好像都不支持 ipv6 啊,网络延迟高这情况我还没测试
    daimaosix
        79
    daimaosix  
       2022-03-09 16:32:15 +08:00
    @bmpidev2019 大佬,我始终没看明白你仓库的配置文档怎么回事,按照你流程走的,看着也不复杂,跑起来访问 7000 端口显示:{"error":"not found"}
    Ironboy
        80
    Ironboy  
       2022-09-24 19:47:36 +08:00
    想要火起来的话,可以结合一些场景,像比如像 Clubhouse 做成的语音社交应用。或者像做成 Omeglel 国际网友语言学习平台。希望对 op 有帮助!
    bmpidev2019
        81
    bmpidev2019  
    OP
       2022-09-25 19:47:46 +08:00 via iPhone
    @Ironboy 只是学习搭建的,如果要正常运行挺耗费服务器资源的,成本不低,bug 语言学习这个场景挺不错的,我也正有这个计划,多加一些基于语言视频的一些场景化的功能。
    7897894
        82
    7897894  
       2023-08-05 21:43:28 +08:00
    大佬 有部署教程吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3442 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:29 · PVG 18:29 · LAX 02:29 · JFK 05:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.