[+] 优化

This commit is contained in:
acgist
2023-02-17 23:47:23 +08:00
parent 95f2221ebb
commit 9023883c5b
90 changed files with 1142 additions and 1216 deletions

View File

@@ -16,6 +16,47 @@ make
make -C worker
```
## 事件
```
mediasoup.observer.on("newworker", fn(worker));
worker.on("died", fn(error));
worker.observer.on("close", fn());
worker.observer.on("newrouter", fn(router));
worker.observer.on("newwebrtcserver", fn(router));
router.on(“workerclose”, fn());
router.observer.on(“close”, fn());
router.observer.on(“newtransport”, fn(transport));
router.observer.on(“newrtpobserver”, fn(rtpObserver));
transport.on("trace", fn(trace));
transport.on(“routerclose”, fn());
transport.on(“listenserverclose”, fn());
transport.on(“trace”, fn(trace));
webRtcTransport.on(“icestatechange”, fn(iceState))
webRtcTransport.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
webRtcTransport.on(“dtlsstatechange”, fn(dtlsState))
webRtcTransport.on(“sctpstatechange”, fn(sctpState))
plainTransport.on(“tuple”, fn(tuple))
plainTransport.on(“rtcptuple”, fn(rtcpTuple))
plainTransport.on(“sctpstatechange”, fn(sctpState))
pipeTransport.on(“sctpstatechange”, fn(sctpState))
directTransport.on(“rtcp”, fn(rtcpPacket))
transport.observer.on(“close”, fn())
transport.observer.on(“newproducer”, fn(producer))
transport.observer.on(“newconsumer”, fn(consumer))
transport.observer.on(“newdataproducer”, fn(dataProducer))
transport.observer.on(“newdataconsumer”, fn(dataConsumer))
transport.observer.on(“trace”, fn(trace))
webRtcTransport.observer.on(“icestatechange”, fn(iceState))
webRtcTransport.observer.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
webRtcTransport.observer.on(“dtlsstatechange”, fn(dtlsState))
webRtcTransport.observer.on(“sctpstatechange”, fn(sctpState))
plainTransport.observer.on(“tuple”, fn(tuple))
plainTransport.observer.on(“rtcptuple”, fn(rtcpTuple))
plainTransport.observer.on(“sctpstatechange”, fn(sctpState))
pipeTransport.observer.on(“sctpstatechange”, fn(sctpState))
```
## 安全
默认媒体服务只要暴露媒体`UDP`端口,信令接口不用暴露,所以使用简单鉴权。

View File

@@ -6,17 +6,19 @@ const os = require("os");
module.exports = {
// 服务名称
name: "taoyao-media-server",
// 服务版本
version: "1.0.0",
// 交互式命令行
command: true,
// 欢迎页面
welcome: `${__dirname}/index.html`,
// 日志级别
logLevel: "DEBUG",
// 录像目录
recordStoragePath: "/data/record",
// 信令服务
https: {
// 信令服务地址端口
listenIp: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
listenPort: process.env.HTTPS_LISTEN_PORT || 4443,
listenPort: process.env.HTTPS_LISTEN_PORT || 9443,
// 信令服务安全配置
username: "taoyao",
password: "taoyao",
@@ -26,6 +28,14 @@ module.exports = {
key: process.env.HTTPS_CERT_PRIVATE_KEY || `${__dirname}/certs/privateKey.pem`,
},
},
// 水印
watermark: {
enabled: false,
text: "taoyao",
posx: 0,
posy: 0,
opacity: 1,
},
// Mediasoup
mediasoup: {
// 配置Worker进程数量

View File

@@ -207,6 +207,9 @@ class Signal {
case "room::create":
this.roomCreate(session, message, message.body);
break;
case "transport:webrtc::create":
this.transportWebrtcCreate(session, message, message.body);
break;
}
}
@@ -311,6 +314,95 @@ class Signal {
return room;
}
/**
* @param {*} session 信令通道
* @param {*} message 消息
* @param {*} body 消息主体
*/
transportWebrtcCreate(session, message, body) {
const {
roomId,
forceTcp,
producing,
consuming,
sctpCapabilities
} = body;
const webRtcTransportOptions =
{
...config.mediasoup.webRtcTransportOptions,
enableSctp : Boolean(sctpCapabilities),
numSctpStreams : (sctpCapabilities || {}).numStreams,
appData : { producing, consuming }
};
if (forceTcp)
{
webRtcTransportOptions.enableUdp = false;
webRtcTransportOptions.enableTcp = true;
}
const room = this.rooms.get(roomId);
const transport = await room.mediasoupRouter.createWebRtcTransport(
{
...webRtcTransportOptions,
webRtcServer : room.webRtcServer
});
transport.on('sctpstatechange', (sctpState) =>
{
logger.debug('WebRtcTransport "sctpstatechange" event [sctpState:%s]', sctpState);
});
transport.on('dtlsstatechange', (dtlsState) =>
{
if (dtlsState === 'failed' || dtlsState === 'closed')
logger.warn('WebRtcTransport "dtlsstatechange" event [dtlsState:%s]', dtlsState);
});
// NOTE: For testing.
// await transport.enableTraceEvent([ 'probation', 'bwe' ]);
await transport.enableTraceEvent([ 'bwe' ]);
transport.on('trace', (trace) =>
{
logger.debug(
'transport "trace" event [transportId:%s, trace.type:%s, trace:%o]',
transport.id, trace.type, trace);
if (trace.type === 'bwe' && trace.direction === 'out')
{
peer.notify(
'downlinkBwe',
{
desiredBitrate : trace.info.desiredBitrate,
effectiveDesiredBitrate : trace.info.effectiveDesiredBitrate,
availableBitrate : trace.info.availableBitrate
})
.catch(() => {});
}
});
// Store the WebRtcTransport into the protoo Peer data Object.
peer.data.transports.set(transport.id, transport);
self.push(
{
id : transport.id,
iceParameters : transport.iceParameters,
iceCandidates : transport.iceCandidates,
dtlsParameters : transport.dtlsParameters,
sctpParameters : transport.sctpParameters
}, session);
const { maxIncomingBitrate } = config.mediasoup.webRtcTransportOptions;
// If set, apply max incoming bitrate limit.
if (maxIncomingBitrate)
{
try { await transport.setMaxIncomingBitrate(maxIncomingBitrate); }
catch (error) {}
}
}
}
module.exports = Signal;