前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【开发日记】使用WebRTC实现类微信的实时音视频通话

【开发日记】使用WebRTC实现类微信的实时音视频通话

作者头像
全栈开发日记
发布于 2024-11-23 01:55:12
发布于 2024-11-23 01:55:12
64100
代码可运行
举报
文章被收录于专栏:全栈开发日记全栈开发日记
运行总次数:0
代码可运行

1、背景

需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。

第二种方案无疑是最稳定的,但价格太劝退了,所以退而求其次使用WebRTC技术实现,下面是在uni-app技术中实现WebRTC的记录。

完整代码请在公众号【全栈开发日记】后台回复“WebRTC”获取。

2、web-view与uniapp通信

webview中html必须引入uni.webview.js文件。uniapp有提供的官方下载地址,去官网找一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script type="text/javascript" src="js/webview.js"></script>

2.1、uniapp发消息给webview

uniapp发送代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <view class="container">
        <web-view :src="webSrc" ref="webview" @onPostMessage="handlePostMessage" @message="handlePostMessage"></web-view>
    </view>
</template>
<script>
    onLoad() {
        /* #ifdef APP-PLUS */
        this.webSrc = plus.io.convertLocalFileSystemURL('_www/hybrid/html/camera.html');
        var currentWebview = this.$scope.$getAppWebview()
        setTimeout(()=>{this.wv = currentWebview.children()[0];},1000)
        /* #endif */
    },
    methods: {
        sendWebViewMessage(event){
            this.wv.evalJS("receiveAppMessage('" + JSON.stringify(event) + "')")
        },
    }
</script>

这里省略data中的数据。需要注意的是必须延时一秒再设定this.wv

webview接收代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function receiveAppMessage(event) {
    event = JSON.parse(event);
}

2.1、webview发消息给uniapp

webview发送代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sendAppMessage(event) {
    uni.postMessage({
        data: event
    });
}

uniapp接收代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <view class="container">
        <web-view :src="webSrc" ref="webview" @onPostMessage="handlePostMessage" @message="handlePostMessage"></web-view>
    </view>
</template>

handlePostMessage: function (event) {
    console.log('接收webview发送的消息:', JSON.stringify(event.detail.data));
},

3、建立RTC连接

为了形象的表达建立WebRTC连接的整个过程,可以结合下面的时序图对照着文字代码部分进行理解。

WebRTC时序图

3.1、呼叫方进入视频界面,并发送视频请求

发送视频请求使用的是HTTP请求,服务端接收到请求后再通过WS推送给被呼叫方,被呼叫方被动进入视频界面。同时呼叫方建立RTC中独有的WS连接,也就是说现在呼叫方除了软件建立的WS连接,还有RTC的WS连接,用于后续的音视频通话

3.2、被呼叫方被动进入视频界面,接收视频请求

如果被呼叫方接收到了呼叫请求,则建立RTC中独有的WS连接。

3.3、被呼叫方接受呼叫

被呼叫方受到视频请求时,界面出现接通拒接两个选项,如果被呼叫方选择接通,则通过RTC中独有的WS连接发送给呼叫方告知被呼叫方接受了视频请求。

3.4、呼叫方接受呼叫

呼叫方收到了被呼叫方接受了视频请求的消息后,也向被呼叫方回复一条呼叫方知道了被呼叫方准备建立RTC连接的消息。

3.5、被呼叫方创建peer连接并发送offer

被呼叫方收到呼叫方的回复后,知道了呼叫方已经做好准备了,于是创建peer连接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.createPeerConnection();
peer.createOffer(createOfferAndSendMessage, handleCreateOfferError);
// 创建RTCPeerConnection对象
function createPeerConnection() {
    const configuration = {
        iceServers: [
            {
                urls: ["stun:这里是stun服务地址:3478"]
            },
            {
                urls: "turn:这里是turn服务地址:3478",
                username: "turn服务账号",
                credential: "turn服务密码"
            }
        ]
    };
    peer = new RTCPeerConnection(configuration);
    // 下面两个方法在3.9中补充
    peer.onicecandidate = handleIceCandidate;
    peer.onaddstream = handleRemoteStreamAdded;
    for (const trac of localStream.getTracks()) {
        peer.addTrack(trac, localStream);
    }
}
// 被呼叫方创建offer并发送offer给呼叫方
function createOfferAndSendMessage(sessionDescription) {
    peer.setLocalDescription(sessionDescription).then(() => {
        ws.send(JSON.stringify(
            {
                type: 'TO_ONE',
                uid: this.getCurrentUid(),
                to: this.getCallUid(),
                content: {
                    type: "PASSIVE_OFFER",
                    callUid: this.getCurrentUid(),
                    offer: sessionDescription
                }
            }
        ));
    })
}

3.6、呼叫方接受offer

呼叫方收到被呼叫方的offer后先创建自己的RTCPeerConnection对象,然后根据被呼叫方发来的offer设置远程连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// createPeerConnection方法和上面的一样
this.createPeerConnection();
// message.offer就是被呼叫方发送过来的
peer.setRemoteDescription(new RTCSessionDescription(message.offer));

3.7、呼叫方创建并发送应答

呼叫方接受了offer后需要发送一份应答给被呼叫方,以让被呼叫方也知道呼叫方的地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
peer.createAnswer().then(createAnswerAndSendMessage, handleCreateAnswerError);
// 呼叫方创建offer应答
function createAnswerAndSendMessage(sessionDescription) {
    peer.setLocalDescription(sessionDescription);
    ws.send(JSON.stringify(
        {
            type: 'TO_ONE',
            uid: this.getCurrentUid(),
            to: this.getCallUid(),
            content: {
                type: "ACTIVE_ANSWER",
                callUid: this.getCurrentUid(),
                answer: sessionDescription
            }
        }
    ))
}

3.8、被呼叫方接收应答

被呼叫方接收到呼叫方的应答后,根据呼叫方的应答创建RTCSessionDescription对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 这里的message.answer是呼叫方发送来的应答
peer.setRemoteDescription(new RTCSessionDescription(message.answer));

3.9、处理ICE候选

在步骤3.5中创建RTCPeerConnection对象是指定了handleIceCandidatehandleRemoteStreamAdded两个方法。一个是指定如果接收到了远程的视频流后如何处理,另一个是如何处理本地的视频流。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 处理远程视频流
const handleRemoteStreamAdded = (event) => {
    remoteStream= event.stream;
    smallVideo.srcObject = remoteStream;
    smallVideo.play()
}
// 处理ICE候选
const handleIceCandidate = (event) => {
    if (event.candidate) {
        ws.send(JSON.stringify(
            {
                type: 'TO_ONE',
                uid: this.getCurrentUid(),
                to: this.getCallUid(),
                content: {
                    type: "CANDIDATE",
                    callUid: this.getCurrentUid(),
                    candidate: event.candidate
                }
            }
        ))
    }
}

4、停止视频数据传输

即微信视频中时暂时停止视频画面的传输。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
localStream.getVideoTracks()[0].enabled = false;

重新开启摄像头视频的传输重新设置为true即可。

5、停止音频数据传输

即微信视频中时暂停麦克风的输入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
localStream.getAudioTracks()[0].enabled = false;

重新开启麦克风的传输重新设置为true即可。

6、最终效果

WebRTC效果图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
为企业应用开发提速,写给企业IT部门的低代码开发基础知识
简介:应用程序开发长期以来一直是IT部门和业务部门面临的问题。 IT部门总是被新的应用程序需求弄得不堪重负。他们不可能完成业务部门想要完成的每一个项目。 同时,业务部门的用户厌倦了等待,并开始完全绕过IT部门。 今天,我们来探索一下“低代码开发”这个概念,并阐述它将如何帮助解决这个问题,为企业应用开发提速。
葡萄城控件
2019/11/21
7730
【Story】让非程序员也能开发应用:低代码平台的优势与局限
近年来,低代码(Low-Code)开发平台作为一种新兴技术,迅速崛起并受到广泛关注。这些平台承诺使得非专业人士也能够快速构建应用程序,降低了软件开发的门槛,并提高了开发效率。然而,这种技术也引发了关于其对传统软件开发模式的影响的广泛讨论。本文将深入探讨低代码开发平台的机遇与挑战,分析其对开发者工作方式的潜在影响,并探讨其可能带来的行业变革。
LuckiBit
2024/12/11
2230
“低代码”十问
如今,恐怕没有比IT更爱创造新概念的行业了。一方面,源自于信息技术的高速发展,创新层出不穷;另一方面,可能是源自销售的需要,客户总有些猎奇的心理,先不论产品是否充分满足客户的需求,至少新的概念先从心理层面拨弄客户的心扉。
半吊子全栈工匠
2022/12/03
4020
“低代码”十问
【如何看待“低代码”开发平台的兴起?】效率提升还是质量隐忧?
近年来,“低代码”开发平台如雨后春笋般涌现,承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式,引发了IT行业的广泛讨论。低代码平台是提高效率的利器,还是降低了编程门槛导致质量下降?它会改变开发者的工作方式吗?让我们一起探讨低代码开发的机遇与挑战。
Francek Chen
2025/01/22
1380
【如何看待“低代码”开发平台的兴起?】效率提升还是质量隐忧?
低代码开发平台核心功能设计——组件自定义交互实现
笔者最近一直在研究Lowcode(低代码)平台, 也做了非常多的实践, 对于页面可视化搭建平台有了基本的研发方向和解决方案, 后期会陆续分享我对低代码平台的一些理解和解决方案, 并在企业应用层做一些探索.
徐小夕
2020/11/17
3.8K0
低代码开发平台核心功能设计——组件自定义交互实现
中国低代码开发平台的混战——一次说清楚低代码
这两年,无论是资本层面,还是企业IT部门的关注,“低代码”都是绝对的热点。互联网圈也似在一夜之间冒出了各种各样的低代码公司。到底什么是低代码?低代码是新技术么?低代码开发能给企业带来什么价值?企业如何使用低代码?哪些平台是真的低代码哪些是浑水摸鱼蹭热点?我们今天一次性说明白。
APICloud官方
2021/04/13
8530
中国低代码开发平台的混战——一次说清楚低代码
10款2021年国外顶尖的lowcode开发平台
笔者近期调研了几家国外的lowcode平台, 也参考了很多资料, 确实收获很多, 接下来就来给大家介绍一下国外比较有名的lowcode开发平台.
架构之家
2022/07/12
2.2K0
10款2021年国外顶尖的lowcode开发平台
10款2021年国外顶尖的lowcode开发平台
笔者近期调研了几家国外的lowcode平台, 也参考了很多资料, 确实收获很多, 接下来就来给大家介绍一下国外比较有名的lowcode开发平台.
ConardLi
2021/09/08
2K0
10款2021年国外顶尖的lowcode开发平台
Banber助推零代码、低成本可视化开发
近年来,关于低代码(LowCode)和无代码(NoCode)的讨论在前端社区内越来越火,简单的说低代码就是通过编写少量代码的方式完成应用的开发及上线,而无代码则更进一步,不需要编写代码通过配置的方式即可完成整个应用的开发。
Banber可视化云平台
2021/12/01
8640
Banber助推零代码、低成本可视化开发
什么是低代码(Low-Code)?
现如今,我们已全面迈入智能互联网时代,新的技术不断迭代问世,也代表着新的生产力不断深入我们的生活,同时也是开创未来最好的原动力。那就眼下而言,什么样的新技术才能真正解放IT生产力,加速社会数字化转型呢?without doubt!我认为是低代码(Low-Code)。
informat低代码
2023/06/12
6320
什么是低代码(Low-Code)?
一文看懂“低代码,零代码,APAAS”是什么?怎么选?
零代码、低代码、apaas的概念在整个全球行业内已经流行了很长一段时间。那这3个概念分别指的是什么?他们具备何种能力?企业如果要用该如何选?下面织信低代码一文全部给你讲清楚!
informat低代码
2022/04/24
1.4K0
一文看懂“低代码,零代码,APAAS”是什么?怎么选?
IT行业供应过剩?“减负路线”助你成为人人都想要的抢手开发
开发者的IT技能:良莠不齐,优秀的软件开发人员在招聘时往往可遇不可求。包括国家统计局在内的多家权威机构的报告提示,在数字化转型的浪潮下,市场对于软件开发人员的需求数量已经远远地超过现有开发者群体的数量,对掌握移动端编程语言(如Kotlin、Swift等)、DevOps和UI /UX 技能的开发者来说尤其如此。
葡萄城控件
2021/10/26
3410
低代码开发平台的优缺点
低代码平台的营销口号听起来都非常吸引人:只需点击几下就能得到应用。但是,当你进行低代码开发时,你的企业真正的目的是什么呢?
增强现实核心技术产业联盟
2020/11/11
5.4K0
如何在组织中有效地使用低代码工具?
作者:Mike Mason , Karl Brown and Mark Ettrich译者:牛昊天Thoughtworks 第 28 期技术雷达中提出,市场中低代码平台能力在近些年取得巨大进步,但依然主要集中在解决中低复杂度场景问题,当面对复杂的业务场景时,仍然存在一定的平台限制。所以建议企业考虑采用低代码技术前,仔细深入评估自己的需求和低代码技术之间的平衡——有界限地使用低代码平台。
ThoughtWorks
2023/12/10
2560
如何在组织中有效地使用低代码工具?
什么是低代码(Low-Code)?我们需要低代码吗?
什么是低代码(Low Code)?我们需要低代码吗?低代码是怎么火的?国内低代码平台哪家强?以及低代码的核心价值是什么?本文集合本人 6 年来的低代码实践经验和教训,将带领大家深入浅出的了解低代码的那些事儿,全文干货,2500+ 文字,建议收藏!
informat低代码
2024/10/15
2400
低代码和无代码有什么区别?
低代码是一种快速应用程序开发 (RAD) 方法,可通过拖放和下拉菜单界面等可视化构建块自动生成代码。这种自动化允许低代码用户专注于差异化而不是编程的共同点。低代码是手动编码和无代码之间的平衡中间地带,因为它的用户仍然可以在自动生成的代码上添加代码。
低代码布道者
2022/07/22
8720
低代码和无代码有什么区别?
什么是低代码(Low Code)?低代码平台的组成要素包含有哪些?
这个概念火了好几年了,网上也已经有了很多的回答与解释,其实基本大同小异,我们可以把低代码看做是一种“可视化/图形化或组件化”的应用开发方法,即:用较少的代码,加上拖拽组件的方式,去较快的实现或交付应用软件(这类软件可包括ERP/MES/SRM/OA等),将以前IT技术人员不想开发的代码做到自动化,就可以称之为低代码。
informat低代码
2025/06/11
1180
2023年,无代码、低代码8大技术趋势
在数字化转型、新冠疫情、全球经济环境动荡等多因素驱动下,使得组织改变了对低代码、无代码的看法,市场规模和场景化落地实现快速增长。根据Gartner预测,到2025年,70%的应用程序将由低代码和无代码开发平台构建,其中 80%的应用程序由非IT工作者开发而成。
肉眼品世界
2023/02/12
5470
2023年,无代码、低代码8大技术趋势
2020年国内外最好用低代码开发平台盘点(上篇)
低代码开发是⼀种通过可视化进行应用程序开发的方法,使具有不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程序。这些工具通过减少手工编码的工作量来帮助快速开发应用程序,提高开发效率。
增强现实核心技术产业联盟
2020/12/05
3.8K0
低代码是什么意思?
低代码(Low-code)是一种软件开发和应用开发方法论,旨在帮助开发人员快速构建应用软件,同时减少繁琐的手动编码工作。该方法论注重简化开发流程,通过可视化建模和少量的编码,使开发过程更加高效,部分轻量级的场景需求也能让非专业开发人员参与到系统功能的开发中来。
informat低代码
2023/08/02
2860
推荐阅读
相关推荐
为企业应用开发提速,写给企业IT部门的低代码开发基础知识
更多 >
LV.3
BoCloud博云系统架构师
目录
  • 1、背景
  • 2、web-view与uniapp通信
    • 2.1、uniapp发消息给webview
    • 2.1、webview发消息给uniapp
  • 3、建立RTC连接
    • 3.1、呼叫方进入视频界面,并发送视频请求
    • 3.2、被呼叫方被动进入视频界面,接收视频请求
    • 3.3、被呼叫方接受呼叫
    • 3.4、呼叫方接受呼叫
    • 3.5、被呼叫方创建peer连接并发送offer
    • 3.6、呼叫方接受offer
    • 3.7、呼叫方创建并发送应答
    • 3.8、被呼叫方接收应答
    • 3.9、处理ICE候选
  • 4、停止视频数据传输
  • 5、停止音频数据传输
  • 6、最终效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档