当前位置: 首页 > news >正文

Android手把手编写儿童手机远程监控App之WebRtc音视频通信2

概述上节完成webrtc基本实例这节详细讲解webrtc通信。将其复杂的交互分解逐步梳理便于日后维护对其兼容部分予以说明。webrtc建立之前需交互sdk与ice。sdk关于音视频编码内容ice是关于设备网络信息。嘟妈发起通信嘟妈采用vue3嘟宝Android java原生。首先嘟妈发起信息向嘟宝建立连接。嘟妈发起信息之前创建RTCPeerConnection对象peerConnection并指定Coturn服务器Coturn搭建第三章。通过对象peerConnection创建offer将设置offer将offer通过MQTT协议发送嘟宝peerConnection监听事件如icecandidate交互ice事件track音视频事件const configuration{iceServers:[{urls:stun:192.168.1.10:3478},]}// 2. 创建Offerconst offerawait peerConnection.createOffer({offerToReceiveAudio:true,offerToReceiveVideo:true});await peerConnection.setLocalDescription(offer);// 3. 通过MQTT服务发送Offer给嘟宝该函数实现略。pushmsg(offer,JSON.stringify(offer));asyncfunctionpushmsg(code,d){let msg{};msg.dubaoId8206aa74-69c5-483e-83b5-16616e3030eb;msg.dumaIdf1122aeb-f2b0-400d-9919-eddd2eaebaa2;msg.dumaName天使嘟妈;msg.codecode;msg.datad;let sJSON.stringify(msg)client.publish(/dubao/8206aa74-69c5-483e-83b5-16616e3030eb,s)}pushmsg函数封装了嘟妈向嘟宝发送数据的格式。设置嘟宝与嘟妈身份识别码固定。其中code是信令data是信令具体内容。嘟宝收到offer信令嘟宝通过MQTT收到offer信令后通过类PeerConnection开始创建对象peerConnection。创建peerConnection前需要先初始化webrtc环境创建peerConnection指定coturn服务器地址peerConnection创建设置回调事件如onIceCandidate交互事件onAddTrack流媒体事件peerConnection添加音视频流该音视频在建立连接时候发送给嘟妈peerConnection设置嘟妈offer并创建自己的answer发送嘟妈设置offerpublic voidcreatePeerConnection(String remoteSdp){ListPeerConnection.IceServericeServersnewArrayList();iceServers.add(PeerConnection.IceServer.builder(stun:192.168.1.10:3478).createIceServer());PeerConnection.RTCConfiguration confignewPeerConnection.RTCConfiguration(iceServers);peerConnectionfactory.createPeerConnection(config,newPeerConnection.Observer(){Override public voidonIceCandidate(IceCandidate iceCandidate){}Override public voidonAddTrack(RtpReceiver rtpReceiver,MediaStream[]mediaStreams){}});peerConnection.addTrack(getAudioTrack());peerConnection.addTrack(getVideoTrack());SessionDescription offerJSONSessionDescription(remoteSdp);peerConnection.setRemoteDescription(newSdpObserver(){Override public voidonSetSuccess(){print(onSetSuccess);createAnswer();}},offer);}JSONSessionDescription函数将嘟妈发送的offer转换成本地offerpeerConnection 设置offer并设置回调函数设置成功将触发onSetSuccess函数创建自己的answer创建answer嘟宝设置完成嘟妈传来的offer创建answer并发送给嘟妈peerConnection.createAnswer(newSdpObserver(){Override public voidonCreateSuccess(SessionDescription sessionDescription){peerConnection.setLocalDescription(this,sessionDescription);pushmsg(answer,(SessionDescriptionJSON(sessionDescription)));}},newMediaConstraints());pushmsg函数封装了发给嘟妈数据格式其中code是信令data是信令具体内容。嘟宝与嘟妈身份识别码是固定。private voidpushmsg(String code,String data){Msg msgnewMsg();msg.dubaoIdMyService.dubaoId;msg.dumaIdf1122aeb-f2b0-400d-9919-eddd2eaebaa2;msg.dumaName天使嘟妈;msg.codecode;msg.datadata;Gson gsonnewGson();String jsongson.toJson(msg);myMqttClient.publish(/duma/msg.dumaId,json);}嘟妈收到嘟宝answer嘟妈收到嘟宝answer通过peerConnection设置answer如下代码await peerConnection.setRemoteDescription(newRTCSessionDescription(JSON.parse(answer)));嘟妈设置answer后完成sdk交互。此时嘟妈在起初创建peerConnection设置onIceCandidate将被触发此时将ice发送给嘟宝。嘟妈将ice发送嘟宝嘟宝收到ice并设置ice后触发自己的onIceCandidate事件嘟宝在onIceCandidate事件中将ice发给嘟妈至此webrtc交互完成开始相互连接。嘟妈触发onIceCandidate函数peerConnection.addEventListener(icecandidate,(event){// console.log(event)if(event.candidate){// console.log(event.candidate);pushmsg(ice,JSON.stringify(event.candidate));}});嘟宝触发onIceCandidate函数Override public voidonIceCandidate(IceCandidate iceCandidate){Gson gsonnewGson();String sgson.toJson(iceCandidate);pushmsg(ice,s);}webrtc交互完成webrtc交互完成后将自动建立点对点连接通过peerConnection的connectionstatechange事件查看连接结果// 连接状态变化监听peerConnection.addEventListener(connectionstatechange,(){console.log(Connection state:,peerConnection.connectionState);});在track获取到远端音视频流// 监听远程流视频通话场景peerConnection.addEventListener(track,(event){const remoteVideodocument.getElementById(remoteVideo);if(remoteVideo.srcObject){remoteVideo.srcObject.addTrack(event.track);}else{remoteVideo.srcObjectnewMediaStream(event.streams[0]);}});具体代码在上节
http://www.rkmt.cn/news/1403687.html

相关文章:

  • 如何免费激活IDM?3种简单方法永久解锁下载神器
  • 船载无人机自主降落:YOLOv8改进与多传感器融合实战
  • 低成本自制星链无线路由器,灵活配置还能多样升级!
  • 5分钟上手:浏览器多URL批量打开工具Open-Multiple-URLs
  • 别再死磕手册了!手把手教你用CIA402状态机搞定EtherCAT伺服驱动(附状态切换流程图)
  • 基于虚拟本地振荡器与三次样条插值的低成本厘米级可见光定位系统
  • 如何用res-downloader轻松下载视频号、抖音和小红书的加密内容?
  • 《大模型微调成本从 10 万降到 1000 元!LoRA+QLoRA 实战指南》
  • Pearcleaner:重新定义macOS清理体验的开源工具
  • 字节跳动开发岗面试常见问题有哪些
  • 如何用本地AI从视频中精准提取硬字幕:视频字幕提取器的技术实践
  • JAX与TensorFlow在Intel/AMD/NVIDIA平台上的功耗优化实战指南
  • 5大核心功能揭秘:AI视频编辑中的智能镜头控制技术革命
  • 燃料电池空气供给系统控制与故障诊断策略【附程序】
  • Boss-Key:Windows办公隐私保护终极指南,一键隐藏窗口告别尴尬时刻
  • 什么是阻抗匹配?功率传输和防止信号反射的理由及原理
  • ONVIF协议背景及视频网关接入
  • Winhance中文版:让Windows系统重获新生的性能魔法三部曲
  • 基于SDN/SDS的动态公平共享缓冲区策略解决TCP Incast问题
  • 如何通过图像识别技术实现鸣潮游戏自动化:完整指南与架构解析
  • ResNet深度剖析:残差连接如何破解深度网络训练难题?
  • 基于Petri网与FPGA的矩阵变换器高可靠并发控制实现
  • 基于深度可分离卷积与FPGA的激光雷达可行驶区域分割系统设计
  • 基于本地大模型与RAG架构的加密货币内存取证智能分析系统
  • 3步构建专业级数据大屏:Big Screen可视化框架完整指南
  • 通过Nodejs轻松将Taotoken大模型API集成到前端项目
  • AI视觉智慧矿山
  • 职场实用指南4个常见自动生成会议纪要核心使用场景
  • 跨平台资源下载神器:如何3分钟掌握res-downloader完整使用指南
  • Untrunc:视频文件损坏修复的终极解决方案