[+] 合并事件监听还有协议

This commit is contained in:
acgist
2023-02-17 07:07:56 +08:00
parent 948b628937
commit 95f2221ebb
90 changed files with 1098 additions and 1265 deletions

View File

@@ -4,10 +4,11 @@
/**
* 信令配置
* TODO合并到taoyao
*/
const config = {
// 终端标识
sn: "taoyao",
clientId: "taoyao",
// 信令服务地址
host: "localhost",
port: "8888",

View File

@@ -23,7 +23,7 @@
</el-tab-pane>
<el-tab-pane label="创建房间" name="create">
<el-form-item label="媒体服务">
<el-select v-model="room.mediaName" placeholder="媒体服务">
<el-select v-model="room.mediaId" placeholder="媒体服务">
<el-option
v-for="value in config.mediaServerList"
:key="value.name"

View File

@@ -3,7 +3,7 @@
<el-dialog v-model="localVisible" title="终端设置" width="30%" :show-close="false" center>
<el-form ref="SettingSignalForm">
<el-form-item label="终端名称">
<el-input v-model="config.sn" placeholder="终端名称" />
<el-input v-model="config.clientId" placeholder="终端名称" />
</el-form-item>
<el-form-item label="信令帐号">
<el-input v-model="config.username" placeholder="信令帐号" />

View File

@@ -14,6 +14,10 @@ import {
// 日志
const logger = new Logger();
const PC_PROPRIETARY_CONSTRAINTS = {
optional : [ { googDscp: true } ]
};
/**
* 信令通道
*/
@@ -94,7 +98,7 @@ const signalChannel = {
self.push(
protocol.buildMessage("client::register", {
ip: "localhost",
sn: config.sn,
clientId: config.clientId,
signal: 100,
battery: battery.level * 100,
charging: battery.charging,
@@ -284,39 +288,67 @@ const signalChannel = {
*/
class Taoyao {
// 发送信令
push = null;
push;
// 房间ID
roomId;
// 请求信令
request = null;
request;
// 本地视频
localVideo = null;
localVideo;
// 本地终端
localClient;
// 远程终端
remoteClientList;
remoteClients = new Map();
// 媒体通道
sendTransport = null;
recvTransport = null;
sendTransport;
recvTransport;
// 信令通道
signalChannel = null;
signalChannel;
// 媒体设备
mediasoupDevice = null;
mediasoupDevice;
// 是否消费
consume = true;
// 是否生产
produce = true;
// 强制使用TCP
forceTcp = false;
// 使用数据通道
useDataChannel = true;
// 是否生产音频
audioProduce = true && this.produce;
// 是否生成视频
videoProduce = true && this.produce;
// 音频生产者
audioProducer = null;
audioProducer;
// 视频生产者
videoProducer = null;
videoProducer;
// 消费者
consumers = new Map();
// 数据消费者
dataConsumers = new Map();
constructor({
roomId,
peerId,
displayName,
device,
handlerName,
useSimulcast,
useSharingSimulcast,
forceTcp,
produce,
consume,
forceH264,
forceVP9,
svc,
datachannel,
externalVideo,
e2eKey,
consumerReplicas
}) {
this.roomId = roomId;
}
/**
* 打开信令通道
*
@@ -338,21 +370,134 @@ class Taoyao {
};
/**
* 打开媒体通道
* navigator.mediaDevices.getDisplayMedia();
* TODO共享 navigator.mediaDevices.getDisplayMedia();
*/
buildMedia = async function (roomId) {
let self = this;
// 释放资源
self.closeMedia();
self.mediasoupDevice = new mediasoupClient.Device();
const response = await this.request(protocol.buildMessage(
const response = await self.request(protocol.buildMessage(
"router::rtp::capabilities",
{ roomId }
{ roomId : roomId || self.roomId }
));
const routerRtpCapabilities = response.body;
console.log(self.mediasoupDevice);
console.log(routerRtpCapabilities);
self.mediasoupDevice.load({ routerRtpCapabilities });
self.produce();
};
/**
* 生产媒体
*/
produceMedia = async function() {
// 打开媒体TODO参数
const self = this;
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video : true });
const audioTrack = stream.getAudioTracks()[0];
const videoTrack = stream.getVideoTracks()[0];
if(self.produce) {
const transportInfo = await self.request("webrtc::transport::create", {
forceTcp : self.forceTcp,
producing : true,
consuming : false,
sctpCapabilities : self.useDataChannel ? self.mediasoupDevice.sctpCapabilities : undefined
});
const {
id,
iceParameters,
iceCandidates,
dtlsParameters,
sctpParameters
} = transportInfo;
self.sendTransport = self.mediasoupDevice.createSendTransport(
{
id,
iceParameters,
iceCandidates,
dtlsParameters :
{
...dtlsParameters,
role : 'auto'
},
sctpParameters,
iceServers : [],
proprietaryConstraints : PC_PROPRIETARY_CONSTRAINTS,
additionalSettings :
// TODO加密解密
{ encodedInsertableStreams: true }
});
self.sendTransport.on(
'connect', ({ dtlsParameters }, callback, errback) =>
{
self.request(
'webrtc::transport::connect',
{
transportId : self.sendTransport.id,
dtlsParameters
})
.then(callback)
.catch(errback);
});
self.sendTransport.on(
'produce', async ({ kind, rtpParameters, appData }, callback, errback) =>
{
try
{
const { id } = await self.request(
'produce',
{
transportId : self.sendTransport.id,
kind,
rtpParameters,
appData
});
callback({ id });
}
catch (error)
{
errback(error);
}
});
sef.sendTransport.on('producedata', async (
{
sctpStreamParameters,
label,
protocol,
appData
},
callback,
errback
) =>
{
logger.debug(
'"producedata" event: [sctpStreamParameters:%o, appData:%o]',
sctpStreamParameters, appData);
try
{
const { id } = await self.request(
'produceData',
{
transportId : self.sendTransport.id,
sctpStreamParameters,
label,
protocol,
appData
});
callback({ id });
}
catch (error)
{
errback(error);
}
});
}
}
/**
* 关闭媒体
*/