Advertisement

流媒体协议之WebRTC实现p2p视频通话(二)

阅读量:

async init() {
this.socket = await this.connentSocket()
return this
}
async connentSocket() {
if (this.socket) return this.socket
return new Promise((resolve, reject) => {
let socket = io(this.host, { path: this.socketPath })
socket.on(“connect”, () => {
console.log(“连接成功!”)
resolve(socket)
})
socket.on(“connect_error”, e => {
console.log(“连接失败!”)
throw e
reject()
})
// 呼叫被接受
socket.on(‘answer’, ({ answer }) => {
this.peer && this.peer.setRemoteDescription(answer)
})
// 被呼叫事件
socket.on(‘called’, callingInfo => {
this.called && this.called(callingInfo)
})
// 呼叫被拒
socket.on(‘callRejected’, () => {
this.getCallReject && this.getCallReject()
})

socket.on('iceCandidate', () => {
console.log('远程为远端注册ice candidate');
this.peer && this.peer.registerAsIceCandidate(new RTCIceCandidate(iceCandidate))
})

}
addEvent(name, cb) 定义了一个处理事件的函数:
当 socket 存在时,
该函数会将 name 事件绑定到回调函数 cb。
绑定后,
socket 将执行绑定后的操作。

addstream事件监听器绑定给cb函数。
接收来自远端的流事件。
当addstream事件发生时:
输出日志信息并记录当前流。
通过回调函数传递该流给cb参数。
返回操作完成后的结果。
同样地:
监听icecandidate事件绑定给cb参数。
当icecandidate候选发送完毕时:
输出消息并传递候选信息给目标端口。
通过回调函数传递给cb参数。
返回操作后的结果。

})
返回此
}
// 检测冰协商过程
冰协商状态变化事件 () {
this.peer.addEventListener('icegatheringstatechange', e => {
console.log('正在协商中: ', e.target.iceGatheringState);
})
返回此
}
// 关闭RTC
closeRTC() {
// …
}

后端

此处将Socket.IO导入为模块。此模块将被命名为 socketIO,并用于创建一个名为 socketIO 的 Socket.IO 实例。其中 path 属性指定为 /websocket 路径。

let userRoom = {
list: [],
addAllUsers(user): {
this.list.push(user);
return this;
},
deleteById(id): {
this.list = this.list.filter(u => u.id !== id);
return this;
},
sendToAllUser(name, data): {
for (const userInfo of this.userList)
socketIO.emit(userInfo.id, name: name, data: data);
return this;
},
sendToMe(eventName, eventData): {
socketIO.emit(this.eventName, eventName: eventName, eventData: eventData);
}
};

2.后端

使用import关键字引入Socket.IO模块。
socketIO = new Socket.IO();
socketIO.path = '/websocket';

let userRoom = {
list: [],
add(user) {
this.list.push(user)
return this
},
del(id) {
this.list = this.list.filter(u => u.id !== id)
return this
},
sendAllUser(name, data) {
this.list.forEach(({ id }) => {
console.log(‘>>>>>’, id)
socketIO.to(id).emit(name, data)
})
return this
},
sendTo(id) {
return (eventName, data) => {
socketIO.to(id).emit(eventName, data)
}
},
findName(id) {
return this.list.find(u => u.id === id).name
}
}

socketIO.on(‘connection’, function(socket) {
console.log(‘连接加入.’, socket.id)

socket.on('addUser', (data) => {
console.log(data.name, '以' + data.roomNum + '号房间加入');
let user = {
id: socket.id,
name: data.name,
calling: false
};
userRoom.add(user).sendAllUsers({
updateUserList: userRoom.list
});
});

socket.on('sendMessage', (content) => {
console.log('消息已转发:', content);
const userInfo = userRoom.findName(socket.id);
userRoom.sendAllUser('更新消息列表', { userId: socket.id, message: content, 用户信息: userInfo });
});

socket.once('iceCandidate', ({ id, iceCandidate }) => {
发出消息到'iceCandidate'信道
userRoom.sendMessageTo(id)(‘iceCandidate’, { iceCandidate, id: socket.id })
})

socket.response('offers').then((i, o) => {
console.log('Transmit the offer message to room ' + i.toString() + ' with ID ' + i.id);
userRoom.sendTo(i).call(
'called',
{
offer,
id: socket.id,
name: userRoom.findName(socket.id)
}
);
});

const response = socket.bind('response', (id, answer) => {
alert('接受视频');
userRoom.postMessageTo(id, '回答', {message: answer});
});

socket.triggerOn('rejectedCall', roomId => {
alert('成功接收拒接请求')
roomMessage.SendMessage(roomId, 'callRejected')
})

socket.on('close', () => { // 手动断开连接
// 删除指定房间,并将用户信息更新到用户列表
console.log('连接被手动断开', socket.id);
userRoom.delete(socket.id).sendAllUser('更新用户列表', userRoom.list);
});

module.exports = socketIO

此脚本不在当前功能范围内,
该模块主要负责HTTP服务的创建与配置,
其中包括对应用逻辑以及 Socket.IO 代理的支持,
通过require加载相应的外部模块,
最终将所有资源整合至服务器端运行。
创建HTTP服务器实例并配置其绑定地址及端口,
随后通过socketIO.attach()绑定到该服务器上,
最后调用listen()方法启动服务监听状态。
启动服务器监听指定端口时,
会触发日志记录:"server start on 127.0.0.1:3003"。

搭建 STUN/TURN

因为没有钱买服务器 没试过

coturn 据说使用它搭建 STUN/TURN 服务非常的方便

编译

cd coturn
./configure --prefix=/usr/local/coturn
sudo make -j 4 && make install

配置

listening-port assignment 使用端口号 3478【强调

启动

切换至...目录:
cd /usr/local/coturn/bin 启动TurnServer服务: turnserver -c …/etc/turnserver.conf
自我介绍一下
小编于2013年毕业于上海交通大学,
曾在小公司工作过一段时间,
也在华为、OPPO等知名企业实习或工作过,
18年进入阿里一直到现在。

众所周知, 许多前端开发人员希望提升技能通常是通过自主学习或者参加培训课程. 然而高昂的学费(通常)在几千元以上确实给许多人带来了经济压力. 尽管如此, 在没有成体系的学习情况下进行自我学习可能会导致效率低下且耗时较长;同时, 在技术达到瓶颈之前很难继续深入.

为了方便想自学提升却又不知道从何入手的朋友,《2024年Web前端开发全套学习资料》应运而生。初志很简单——希望这份资料能成为大家自学Web前端开发的入门指南,并让大家不用为学习资源感到困扰。

img

**不仅为新手提供基础入门的学习材料, 还为有3年以上经验的用户提供深入学习提升的专业课程. 该课程组成了当前前端开发领域的95%以上的知识点, 构成了一套完整且系统的知识体系. **

由于文件比较大,在此仅提供部分内容的截图。每个节点均包含大厂面经、学习笔记、源码讲义、实战项目以及讲解视频,并会持续不断地更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

为大家整理一套关于HTML的面试题;对于有需求的朋友们来说,点击链接即可获取完整套题;机会难得不容错过。

真正体系化!**

[外链图片转存中…(img-RHUQIvOA-1712797611242)]

因为文件较大,在此仅列出部分目录以便参考,并且每个节点都包含大厂面经、学习笔记、源码讲义、实战项目以及讲解视频内容,并会持续补充和完善。

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

请各位朋友给我一些关于HTML的面试题。如需获取相关问题,请抓紧时间访问可以戳这里获取

[外链图片转存中…(img-UJ5Xq77z-1712797611242)]
[外链图片转存中…(img-SOqFwcfZ-1712797611242)]

全部评论 (0)

还没有任何评论哟~