WebRtc一对一视频通话_New_peer信令处理

news2024/9/20 16:50:00

文章目录

  • 一对一视频通话
    • New_peer信令处理

2024-9-19
梳理信令处理的函数嵌套及实现思路

一对一视频通话

New_peer信令处理

ZeroRTCEngine.prototype.onMessage = function (event) {
    console.log("onMessage: " + event.data);
    var jsonMsg = null;
    try {
         jsonMsg = JSON.parse(event.data);//解序列化
    } catch(e) {
        console.warn("onMessage parse Json failed:" + e);
        return;
    }

    switch (jsonMsg.cmd) {//解析信令(图中橙色框)
        case SIGNAL_TYPE_NEW_PEER:
            handleRemoteNewPeer(jsonMsg);
            break;
        case SIGNAL_TYPE_RESP_JOIN:
            handleResponseJoin(jsonMsg);
            break;
        case SIGNAL_TYPE_PEER_LEAVE:
            handleRemotePeerLeave(jsonMsg);
            break;
        case SIGNAL_TYPE_OFFER:
            handleRemoteOffer(jsonMsg);
            break;
        case SIGNAL_TYPE_ANSWER:
            handleRemoteAnswer(jsonMsg);
            break;
        case SIGNAL_TYPE_CANDIDATE:
                handleRemoteCandidate(jsonMsg);
            break;
    }
}           



function handleRemoteNewPeer(message) {
    console.info("handleRemoteNewPeer, remoteUid: " + message.remoteUid);
    remoteUserId = message.remoteUid;
    doOffer();
}

function doOffer() {
    // 创建RTCPeerConnection
    if (pc == null) {
        createPeerConnection();
    }
    pc.createOffer().then(createOfferAndSendMessage).catch(handleCreateOfferError);
}

function createPeerConnection() {
    pc = new RTCPeerConnection(null);
    pc.onicecandidate = handleIceCandidate;
    pc.ontrack = handleRemoteStreamAdd;

    localStream.getTracks().forEach((track) => pc.addTrack(track, localStream));
 
 
 function handleIceCandidate(event) {
    console.info("handleIceCandidate");
    if (event.candidate) {
        var jsonMsg = {
            'cmd': 'candidate',
            'roomId': roomId,
            'uid': localUserId,
            'remoteUid': remoteUserId,
            'msg': JSON.stringify(event.candidate)
        };
        var message = JSON.stringify(jsonMsg);
        zeroRTCEngine.sendMessage(message);
        // console.info("handleIceCandidate message: " + message);
        console.info("send candidate message");
    } else {
        console.warn("End of candidates");
    }
}

function handleRemoteStreamAdd(event) {
    console.info("handleRemoteStreamAdd");
    remoteStream = event.streams[0];
    remoteVideo.srcObject = remoteStream;
}

function createOfferAndSendMessage(session) {
    pc.setLocalDescription(session)
        .then(function () {
            var jsonMsg = {
                'cmd': 'offer',
                'roomId': roomId,
                'uid': localUserId,
                'remoteUid': remoteUserId,
                'msg': JSON.stringify(session)
            };
            var message = JSON.stringify(jsonMsg);
            zeroRTCEngine.sendMessage(message);
            // console.info("send offer message: " + message);
            console.info("send offer message");
        })
        .catch(function (error) {
            console.error("offer setLocalDescription failed: " + error);
        });

}


function handleCreateOfferError(error) {
    console.error("handleCreateOfferError: " + error);
}

当执行信令 handleRemoteNewPeer 时,表示有一个新的远程对等体加入了房间,并且这个信息已经通过 WebSocket 接收并被解析为 JSON 对象 message
handleRemoteNewPeer 信令的详细执行流程:

  1. 记录日志

    • console.info("handleRemoteNewPeer, remoteUid: " + message.remoteUid);:在控制台输出一条信息,表明一个新的远程对等体已经加入,同时显示这个对等体的用户 ID。
  2. 保存远程用户 ID

    • remoteUserId = message.remoteUid;:将消息中的 remoteUid 保存到全局变量 remoteUserId 中。这个 ID 用于标识远程对等体,后续的 WebRTC 操作(如发送 offer)会使用这个 ID 来指定目标用户。
  3. 创建 WebRTC 连接

    • doOffer();:调用 doOffer 函数,开始创建 WebRTC 连接并发送 offer。这个函数的作用是初始化 RTCPeerConnection 对象(如果尚未创建),并创建一个 offer 来开始协商过程。
  4. 创建 RTCPeerConnection 对象

    • 如果 pcRTCPeerConnection 对象)为 null,则调用 createPeerConnection 函数来创建一个新的 RTCPeerConnection 对象。这个对象负责管理 WebRTC 连接的协商和维护。
  5. 设置 ICE 候选者和远程媒体流事件处理

    • createPeerConnection 函数中,为 RTCPeerConnection 对象设置了 onicecandidateontrack 事件处理函数。onicecandidate 处理本地 ICE 候选者的生成,而 ontrack 处理远程媒体流的添加。
      在 WebRTC 中,ICE(Interactive Connectivity Establishment)协议用于在对等体之间建立连接。这个过程需要通过一系列的步骤来发现并验证不同的网络路径,以找到可以用于媒体传输的最佳路径。以下是设置 ICE 候选者和远程媒体流事件处理的详细解析:

  1. ICE 候选者(ICE Candidates)

    • ICE 候选者是网络接口的描述,可以用来在对等体之间传输媒体流。每个候选者包括一个网络地址和一个端口号,以及可能的其他元数据,如传输协议类型(如 UDP 或 TCP)。
  2. 收集 ICE 候选者

    • RTCPeerConnection 对象在创建时会开始 ICE 候选者的收集过程。这个过程是异步的,会在不同的时间点生成多个候选者。
  3. 设置 onicecandidate 事件处理函数

    • pc.onicecandidate = handleIceCandidate;:为 RTCPeerConnection 对象设置 onicecandidate 事件处理函数。每当有新的 ICE 候选者生成时,这个事件处理函数会被调用。
  4. 处理 ICE 候选者事件

    • handleIceCandidate(event):这个函数会在 onicecandidate 事件触发时执行。它检查事件对象 event 是否包含 candidate 属性。
  5. 发送 ICE 候选者

    • 如果 event.candidate 存在,表示有一个可用的 ICE 候选者。这个候选者会被序列化为 JSON 格式,并封装在一个信令消息中,然后通过 WebSocket 发送给远程对等体。
    • var jsonMsg = { 'cmd': 'candidate', ... };:创建一个包含信令类型、房间 ID、用户 ID 和候选者数据的 JSON 对象。
    • var message = JSON.stringify(jsonMsg);:将 JSON 对象转换为字符串,以便通过网络发送。
    • zeroRTCEngine.sendMessage(message);:调用 ZeroRTCEngine 实例的 sendMessage 方法,将消息发送给远程对等体。
  6. 结束候选者收集

    • 如果 event.candidate 不存在,表示候选者收集过程已经结束。这时,可以发送一个特殊的信令消息,告知远程对等体没有更多的候选者。
  7. 远程媒体流事件处理

    • pc.ontrack = handleRemoteStreamAdd;:为 RTCPeerConnection 对象设置 ontrack 事件处理函数。每当远程媒体流的第一帧数据到达时,这个事件处理函数会被调用。
  8. 处理远程媒体流

    • handleRemoteStreamAdd(event):这个函数会在 ontrack 事件触发时执行。它获取事件对象 event 中的远程媒体流,并将其绑定到远程视频元素上,以便在网页上显示远程视频。
  9. 显示远程视频

    • remoteVideo.srcObject = remoteStream;:将远程媒体流 remoteStream 绑定到远程视频元素 remoteVideo 上。这样,远程视频流就会在视频元素中播放。

  1. 添加本地媒体流到 RTCPeerConnection

    • localStream.getTracks().forEach((track) => pc.addTrack(track, localStream));:将本地媒体流 localStream 的轨道添加到 RTCPeerConnection 对象中。这样,当连接建立后,本地媒体流可以被远程对等体接收。
  2. 创建并发送 offer

    • pc.createOffer().then(createOfferAndSendMessage).catch(handleCreateOfferError);:调用 RTCPeerConnection 对象的 createOffer 方法来创建一个新的 offer。创建成功后,通过 createOfferAndSendMessage 函数将 offer 封装为 JSON 消息并通过 WebSocket 发送给远程对等体。
  3. 处理创建 offer 错误

    • 如果在创建 offer 过程中出现错误,catch 块会捕获这个错误,并调用 handleCreateOfferError 函数来记录错误信息。

总结来说,当执行 handleRemoteNewPeer 信令时,应用程序会为新加入的远程对等体创建一个 WebRTC 连接,并开始协商过程,以便进行音频和视频通信。这个过程包括创建 RTCPeerConnection 对象、添加本地媒体流、创建 offer 并发送给远程对等体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能【AI】:未来的驱动力

在21世纪,人工智能(AI)已经成为推动技术进步和创新的关键力量。AI不仅仅是科幻小说中的概念,它已经渗透到我们日常生活的方方面面,从智能手机的语音助手到复杂的医疗诊断系统,AI的应用无处不在。 人工智能…

KG Structure as Prompt:利用知识图谱构建Prompt,提高大模型对因果关系的理解

KG Structure as Prompt:利用知识图谱构建Prompt,提高大模型对因果关系的理解 秒懂大纲提出背景解法拆解创意视角中文意译 论文:Knowledge Graph Structure as Prompt: Improving Small Language Models Capabilities for Knowledge-based Ca…

Mybatis框架映射---代码实现(XML配置以及注解形式)

目录 一. 映射关系 1 对 1-映射方式 1.通过xml文件实现映射的一对一关系 总结 : 2.通过注解的方式来实现下面的 1 对 1 的映射关系,实现级联查询 总结: 二. 映射关系多对一 1.通过xml文件实现映射的多对一关系 2.通过注解的方式来实现…

PHP发邮件教程:配置SMTP服务器发送邮件?

PHP发邮件的几种方式?如何使用PHP通过SMTP协议发信? PHP作为一种广泛使用的服务器端脚本语言,提供了多种方式来发送邮件。AokSend将详细介绍如何通过配置SMTP服务器来实现PHP发邮件教程的核心内容。 PHP发邮件教程:设置参数 这…

Qt 模型视图(一):概述

文章目录 Qt 模型视图(一):概述1、模型/视图结构基本原理2、模型3、视图4、代理5、简单实例 Qt 模型视图(一):概述 ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据,视图组件显示模型中的数据,在视图组件里修改的数据会被自动…

PCIe扫盲(11)

系列文章目录 PCIe扫盲(一) PCIe扫盲(二) PCIe扫盲(三) PCIe扫盲(四) PCIe扫盲(五) PCIe扫盲(六) PCIe扫盲(七&#xff09…

剪画:一带一路机遇下,自媒体如何跨越语言障碍!

随着国家 “一带一路” 的持续推进,我国的文化魅力如璀璨星辰,在世界舞台上熠熠生辉。美食的独特风味、华服的精美绝伦,越来越受到外国人的喜爱。这对于做自媒体的小伙伴们而言,无疑是一个巨大的机遇。 然而,机遇往往与…

利用Leaflet.js和turf.js创建交互式地图:航道路线绘制

引言 在现代Web应用中,地图的交互性是提供丰富用户体验的关键。Leaflet.js是一个轻量级的开源JavaScript库,它提供了简单易用的API来构建交云的地图。与此同时,turf.js作为一个强大的地理空间分析库,能够处理复杂的地理数据操作。…

Broadcast:Android中实现组件及进程间通信

目录 一,Broadcast和BroadcastReceiver 1,简介 2,广播使用 二,静态注册和动态注册 三,无序广播和有序广播 1,有序广播的使用 2,有序广播的截断 3,有序广播的信息传递 四&am…

AI产品经理面试100问,三天看完一周拿4个offer

AI产品经理面试100问 Attention(重点掌握) 1.什么是 Attention?为什么要用 Attention?它有什么作用? 2.Attention的流程是什么样的? 3.普通的Attention和Transformer的Self-attention之间有什么关系? 4.什么是Self-attention? Transformer(重点掌握) 1.Transformer是什…

[Linux]:信号(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 信号的引入 1.1 信号的概念 在Linux系统中,信号(…

在泰国旅游不会口语怎么办?求推荐翻译软件!!!

如果在泰国旅游时遇到语言障碍,可以采取以下措施:学习一些基础的泰语短语,使用翻译应用程序,携带翻译卡片,利用身体语言,参加有导游的旅行团,选择提供中文服务的酒店和旅行社,使用地…

【leetcode】字典 哈希表习题

1.两数之和(查找表法-哈希表) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次…

【人工智能学习笔记】7_智能语音技术基础

智能语音技术概述 智能语音技术通过对语音进行分析、理解和合成,是计算机设备实现“能听会说”、具备自然语音交流的技术能力。其涉及的范围主要有: 语音合成技术语音识别技术语音测评技术语音降噪与增强技术…智能语音技术的研究内容 智能语音技术的研究难点 智能语音技术…

旅行社区应该如何规划?

近年来,旅游行业逐渐恢复,包括微度假、精致露营、康养旅游、乡村民宿等旅游模式。用户旅游支出、旅游人次逐渐恢复,旅游收入仍待提升。 那么旅游社区应该如何搭建,内容如何规划呢? 我们了解到,很多旅游网…

哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 在使用ArcGIS Pro的过程中,很多朋友发现,Pro有个成对叠加工具集。很多…

PSG3D V2024 注册机 蓝天大数据三维测绘系统

PSG3D2024三维测绘系统是基于 AutoCAD 平台开发的,以“智能、 专业、高效、易学”为设计目标开发的全新一代地理数据采集、编辑 和联动的专业软件。 系统集成了三维测图、坐标转换、地形处理、数字地模、无人机 辅助、不动产调查、土地确权、部件普查和数据转换等专…

数字产业中心:技术赋能产业,如何重塑行业格局!

在数字化浪潮的推动下,数字产业中心正逐步成为推动经济转型升级的重要引擎。这里,技术不仅仅是工具,更是重塑行业格局、引领未来发展的核心力量。 一、技术融合创新,打破传统边界 数字产业中心通过云计算、大数据、人工智能等前沿…

【Python】练习:控制语句(二)第1关

第1关:分支结构基础实训 第一题第二题第三题第四题(※)第五题(※)第六题第七题 第一题 #第一题 for temp in [-280, -100, 0, 20, 120, 200]:#请在下面编写代码# ********** Begin ********** #if temp>-273.15:F9/…

【Git 操作】Git 的基本操作

文章目录 1. Git 的配置2. 工作区、暂存区、版本库 1. Git 的配置 🐧①首先要新建一个目录,该目录用于放项目代码,在该目录下执行git init命令,用于创建一个 Git的本地仓库。 .git ⽬录是 Git 来跟踪管理仓库的。🐧②…