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

WebRtc10: 端对端1v1传输基本流程

媒体能力协商过程

RTCPeerConnection(核心类)

  • 基本格式
    pc = new RTCPeerConnection([configiration]);

RTCPeerConnection方法分类

  • 媒体协商
  • Stream/Track
  • 传输相关方法
  • 统计相关方法

媒体协商过程

在这里插入图片描述

协商状态变化

在这里插入图片描述

媒体协商方法

  • createOffer
  • createAnswer
  • setLocalDescription
  • setRemoeteDescription

createOffer

  • 基本格式
    aPromise = myPeerConnection.createOffer([options]);

createAnswer

  • 基本格式
    aPromise = myPeerConnection.createAnswer([options]);

setLocalDescription

  • 基本格式
    aPromise = myPc.setLocalDescription(sessionDescription);

setRemoeteDescription

  • 基本格式
    aPromise = myPc.setRemoeteDescription(sessionDescription);

Track方法

  • addTrack
  • removeTrack

addTrack

  • 基本格式
    rtpSender = myPc.addTrack(track, stream…);
  • 参数
    track: 添加到RTCPeerConnection中的媒体轨
    stream:指定track所在的stream

removeTrack

  • 基本格式
    myPc.removeTrack(rtpSender);

重要事件

  • onnegotiationneeded
  • onicecandidate

1:1连接的基本流程

在这里插入图片描述

实战:本机内的1:1音视频互通

index.html

<html><head><title>WebRTC PeerConnection</title></head><body><div><video id="localvideo" autoplay playsinline></video><video id="remotevideo" autoplay playsinline></video><div><button id="start">Start</button><button id="call">Call</button><button id="hangup">HangUp</button></div></div><script src="https://webrtc.github.io/adapter/adapter-latest.js"></script><script src="js/main.js"></script></body>
</html>

main.js

'use strict'var localVideo = document.querySelector('video#localVideo');
var remoteVideo = document.querySelector('video#remoteVideo');
var btnStart = document.querySelector('button#start');
var btnCall = document.querySelector('button#call');
var btnHangUp= document.querySelector('button#hangup');var localStream;
var pc1;
var pc2;function gotMediaStream(stream){localVideo.srcObject = stream;localStream = stream;
}function handleError(err){console.log("Failed to call getUserMedia", err);
}function start(){var constraints = {video: true,audio: false }if(!navigator.mediaDevices ||!navigator.mediaDevices.getUserMedia){return;}else {navigator.mediaDevices.getUserMedia(constraints).then(gotMediaStream).catch(handleError);}}function gotAnswerDescription(desc){pc2.setLocalDescription(desc);//send sdp to caller//recieve sdp from calleepc1.setRemoteDescription(desc);}function gotLocalDescription(desc){pc1.setLocalDescription(desc);//send sdp to callee//receive sdp from caller pc2.setRemoteDescription(desc);	pc2.createAnswer().then(gotAnswerDescription).catch(handleError);
}function gotRemoteStream(e){if(remoteVideo.srcObject !== e.streams[0]){remoteVideo.srcObject = e.streams[0];}
}function call(){var offerOptions = {offerToReceiveAudio: 0,offerToReceiveVideo: 1 }pc1 = new RTCPeerConnection();pc1.onicecandidate = (e) => {// send candidate to peer// receive candidate from peerpc2.addIceCandidate(e.candidate).catch(handleError);console.log('pc1 ICE candidate:', e.candidate);}pc1.iceconnectionstatechange = (e) => {console.log(`pc1 ICE state: ${pc.iceConnectionState}`);console.log('ICE state change event: ', e);}pc2 = new RTCPeerConnection();pc2.onicecandidate = (e)=> {// send candidate to peer// receive candidate from peerpc1.addIceCandidate(e.candidate).catch(handleError);console.log('pc2 ICE candidate:', e.candidate);}pc2.iceconnectionstatechange = (e) => {console.log(`pc2 ICE state: ${pc.iceConnectionState}`);console.log('ICE state change event: ', e);}pc2.ontrack = gotRemoteStream;//add Stream to callerlocalStream.getTracks().forEach((track)=>{pc1.addTrack(track, localStream);});pc1.createOffer(offerOptions).then(gotLocalDescription).catch(handleError);}function hangup(){pc1.close();pc2.close();pc1 = null;pc2 = null;}btnStart.onclick = start;
btnCall.onclick = call;
btnHangUp.onclick = hangup;

相关文章:

  • 第三章 权限维持-linux权限维持-隐藏
  • 八闽十三张模块部署测试记录:源码结构拆解与本地运行验证(含常见问题与修复指南)
  • PointPillars(一),跑通OpenPCDet中的demo
  • C语言 之 【栈的简介、栈的实现(初始化、销毁、入栈、出栈、判空、栈的大小、访问栈顶元素、打印)】
  • 【多线程】六、基于阻塞队列的生产者消费者模型
  • AI赋能新媒体运营:效率提升与能力突破实战指南
  • 【云盘】使用阿里云盘托管项目大文件
  • Rain World 雨世界 [DLC 解锁] [Steam Epic] [Windows SteamOS]
  • 【Linux系统】线程
  • LOJ #193 线段树历史和 Solution
  • 腾讯云服务器:bgp服务器搭建要怎么做?bgp服务器的应用有哪些?
  • 初始化列表详解
  • GPT-4o 图像生成与八个示例指南
  • 算法技巧——打表
  • 数字智慧方案5860丨智慧机场整体解决方案(41页PPT)(文末有下载方式)
  • Java大师成长计划之第10天:锁与原子操作
  • PINNs案例——多介质分区温度场
  • Nacos使用
  • DeepSeek实战--Function Calling
  • [官方 IP] Utility Flip-Flop
  • 重庆渝中警方:男子点燃摩托车欲寻衅滋事,被民警和群众合力制服
  • 澳大利亚大选今日投票:聚焦生活成本与“特朗普问题”
  • 体坛联播|赵心童晋级世锦赛决赛,德布劳内一球制胜
  • 以色列消防部门:已控制住耶路撒冷山火
  • 5月人文社科中文原创好书榜|巫蛊:中国文化的历史暗流
  • 首部关于民营经济发展的基础性法律,有何亮点?专家解读