[+] 优化
This commit is contained in:
@@ -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`端口,信令接口不用暴露,所以使用简单鉴权。
|
||||
|
||||
@@ -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进程数量
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user