IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> webrtc入门:5.websockets下传递sdp和ice -> 正文阅读

[网络协议]webrtc入门:5.websockets下传递sdp和ice

在上一节中,我们把RTCPeerConnection 双方的sdpice互换以后,音视频的通道就建立起来了,但是上一节是在一个程序中的,这种程序在现实中,并没有用处。

通常的应用是这样的一个场景,一个端进行视频的推送,另一端进行视频的接收。

幸好的是双方的sdpice都是字符串形式的,我们可以通过websockets 把对方的sdpice先发到服务器上,然后进行互换。

关于websockets 的服务端,我们这里采用的是python,关于python的使用如果是新手,可以参考别的教程,这是使用的版本是3.8。

async def send_chat(websocket):
    """
    Receive and process chat messages from a user.

    """
    global connected
    async for message in websocket:
        # Parse a "talk" event from the UI.
        for ws in connected:
            if ws != websocket:
                await ws.send(message)

这是一个最简单的服务端,在websockets服务端上,就做了一件事情,把发送上来的websocket发来的消息,转发出去。只起到了一个中转的作用。

在发送端,当我们把视频流准备好以后,使用如下的步骤,把sdp发送到对方。

async function call() {

  callButton.disabled = true;

  const configuration = {};
  //源连接,
  pc1 = new RTCPeerConnection(configuration);
  //当ice准备好后,加到目标源中
  pc1.addEventListener('icecandidate', e => onIceCandidate(pc1, e));
  //把localStream的音视频,放到源中
  localStream.getTracks().forEach(track => pc1.addTrack(track, localStream));

  try {
    console.log('pc1 createOffer start');
	
	const offerOptions = {
		offerToReceiveAudio: 1,
		offerToReceiveVideo: 1
	};

	//创建和设置连接描述
    const desc_pc1 = await pc1.createOffer(offerOptions);
	console.log("desc_pc1:");
	console.log(desc_pc1);

	//发送sdp
	const req = {
          type: "sdp",
          content: desc_pc1,
      };
	websocket.send(JSON.stringify(req));

	await pc1.setLocalDescription(desc_pc1);
	
  } catch (e) {
    onCreateSessionDescriptionError(e);
  }
}

把准备好的ice也发送到另一方。

async function onIceCandidate(pc, event) {


  try {
	  console.log(event.candidate.address);

	  //发送ice
      const req = {
        type: "candidate",
        content: event.candidate,
      };
      websocket.send(JSON.stringify(req));


  } catch (e) {
    onAddIceCandidateError(pc, e);
  }
  //console.log(`${getName(pc)} ICE candidate:\n${event.candidate ? event.candidate.candidate : '(null)'}`);
}

在web的另外一端,准备接收发送端的sdpice

async function messageHander(data){
    const event = JSON.parse(data.data);

    console.log("message:" + event['type']);

    switch (event['type']) {
        //接收sdp
        case "sdp":
            const desc_pc1 = event['content'];
            await pc2.setRemoteDescription(desc_pc1);
            const desc_pc2 = await pc2.createAnswer();
            await pc2.setLocalDescription(desc_pc2);
            console.log("answer desc_pc2 :");
            console.log(desc_pc2);

            //发送answer
            const req = {
                type: "answer_sdp",
                content: desc_pc2,
            };
            websocket.send(JSON.stringify(req));

        //接收ice
        case "candidate":
            pc2.addIceCandidate(event['content']);

    }
}

同样的,我们也需要在发送方,接收接收方的sdp,发送方的消息处理就比较简单了。

async function messageHander(data){
  const event = JSON.parse(data.data);
  console.log("message:" + event['type']);

  switch (event['type']) {
    case "answer_sdp":
      const desc_pc2 = event['content'];
      await pc1.setRemoteDescription(desc_pc2);
  }
}

这样我们就把第四节的发送方和接收方,进行浏览器分离了。

在这里插入图片描述
看下这里的ice信息:

在这里插入图片描述

端口号为:54642

这个接口就是流的端口。我们用iftop命令查看下,流量的情况。

在这里插入图片描述
端口号 54642 ,把流推到 100.1:64388端口。这个时候,可以在另外一段,查看,应该会有64388的端口号是开着的。

在这里插入图片描述
这个是在局域网的情况下,可以通过p2p的方式进行视频流的传输,它并不需要第三方的服务器进行中转,这样极大的提高了传输速率。

后面我们会接着看看,如果不在局域网下,我们该如何建立起视频流的连接。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:12:53  更:2022-05-14 10:14:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:21:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码