[*] 日常优化

This commit is contained in:
acgist
2023-06-30 08:12:55 +08:00
parent bcdfcb54a8
commit 02f266dbc9
4 changed files with 112 additions and 110 deletions

View File

@@ -34,6 +34,7 @@ vim /etc/ufw/before.rules
*nat *nat
:PREROUTING ACCEPT [0:0] :PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0]
# TODO补充完整规则
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
-A POSTROUTING -j MASQUERADE -A POSTROUTING -j MASQUERADE
COMMIT COMMIT
@@ -47,7 +48,7 @@ ufw reload
`ip-rewrite` `ip-rewrite`
``` ```
## 端口转发 ## 端口转发规则
* DNAT 目标IP转换 * DNAT 目标IP转换
* SNAT 源IP转换 * SNAT 源IP转换
@@ -67,6 +68,8 @@ ufw reload
## iptables ## iptables
### 清除端口转发规则
``` ```
# 查看nat # 查看nat
iptables -L -t nat iptables -L -t nat

View File

@@ -2,25 +2,9 @@
如果优化代码影响已经优化过的代码需要对旧代码重新优化 如果优化代码影响已经优化过的代码需要对旧代码重新优化
## 代码结构
日志
枚举
常量
变量
静态代码
单例变量
单例静态函数
构造函数
成员函数(`public/protected/private`
静态成员函数
`getter/setter`
## 日常任务 ## 日常任务
* 过时方法 * 过时方法
* 缩进调整:`tab->space`
* 方法改造:`getter/setter`
* 注释优化:详细描述、单位描述 * 注释优化:详细描述、单位描述
* 日志优化: * 日志优化:
* 添加测试: * 添加测试:
@@ -46,6 +30,7 @@
* 稳定性测试 * 稳定性测试
* 分辨率调整 * 分辨率调整
* 安卓内存抖动 * 安卓内存抖动
* 多重子网环境
* 降低视频录像大小 * 降低视频录像大小
* 码率等等参数配置验证 * 码率等等参数配置验证
* 查询消费者生产者信息 * 查询消费者生产者信息

View File

@@ -32,8 +32,8 @@ import java.util.function.Consumer;
* TODO通过setRemoteDescription设置x-google-start-bitrate、x-google-min-bitrate、x-google-max-bitrate * TODO通过setRemoteDescription设置x-google-start-bitrate、x-google-min-bitrate、x-google-max-bitrate
* *
* 注意: * 注意:
* 2. offer/answer/candidate枚举大小 * 1. offer/answer/candidate枚举大小
* 1. candidate格式安卓和浏览器格式不同 * 2. candidate格式安卓和浏览器格式不同
* *
* @author acgist * @author acgist
*/ */

View File

@@ -224,7 +224,7 @@ const signalChannel = {
*/ */
close() { close() {
const me = this; const me = this;
console.info("关闭通道", me.address); console.info("关闭信令通道", me.address);
clearTimeout(me.heartbeatTimer); clearTimeout(me.heartbeatTimer);
clearTimeout(me.reconnectTimer); clearTimeout(me.reconnectTimer);
me.reconnection = false; me.reconnection = false;
@@ -323,11 +323,7 @@ class Room {
// 不用通知直接使用音量监控即可 // 不用通知直接使用音量监控即可
me.activeSpeakerObserver.on("dominantspeaker", (dominantSpeaker) => { me.activeSpeakerObserver.on("dominantspeaker", (dominantSpeaker) => {
const producer = dominantSpeaker.producer; const producer = dominantSpeaker.producer;
console.debug( console.debug("当前讲话终端", producer.id, producer.clientId);
"handleActiveSpeakerObserver dominantspeaker",
producer.id,
producer.clientId
);
}); });
// me.activeSpeakerObserver.observer.on("dominantspeaker", (dominantSpeaker) => {}); // me.activeSpeakerObserver.observer.on("dominantspeaker", (dominantSpeaker) => {});
} }
@@ -599,7 +595,7 @@ class Taoyao {
*/ */
clientRegister(message, body) { clientRegister(message, body) {
protocol.clientIndex = body.index; protocol.clientIndex = body.index;
console.debug("终端注册成功", protocol.clientIndex); console.info("终端注册成功", protocol.clientIndex);
} }
/** /**
@@ -630,7 +626,7 @@ class Taoyao {
const room = me.rooms.get(roomId); const room = me.rooms.get(roomId);
if(!room) { if(!room) {
// 直接关闭房间时,房间关闭可能早于结束录像。 // 直接关闭房间时,房间关闭可能早于结束录像。
console.debug("服务端录像房间无效", roomId); console.info("服务端录像房间无效", roomId);
return; return;
} }
if(enabled) { if(enabled) {
@@ -650,12 +646,17 @@ class Taoyao {
async controlServerRecordStart(message, body, room) { async controlServerRecordStart(message, body, room) {
const me = this; const me = this;
const { const {
host, roomId, filepath, clientId, host,
audioPort, audioRtcpPort, videoPort, videoRtcpPort, roomId,
filepath,
clientId,
audioPort, audioRtcpPort,
videoPort, videoRtcpPort,
rtpCapabilities, rtpCapabilities,
audioStreamId, videoStreamId, audioProducerId, videoProducerId audioStreamId, videoStreamId,
audioProducerId, videoProducerId
} = body; } = body;
console.info("服务端开始录像", clientId, audioStreamId, videoStreamId); console.info("开始服务端录像", clientId, audioStreamId, videoStreamId);
const plainTransportOptions = { const plainTransportOptions = {
...config.mediasoup.plainTransportOptions, ...config.mediasoup.plainTransportOptions,
// RTP和RTCP端口复用 // RTP和RTCP端口复用
@@ -693,10 +694,10 @@ class Taoyao {
audioConsumer.streamId = audioStreamId; audioConsumer.streamId = audioStreamId;
room.consumers.set(audioConsumerId, audioConsumer); room.consumers.set(audioConsumerId, audioConsumer);
audioConsumer.observer.on("close", () => { audioConsumer.observer.on("close", () => {
console.debug("controlServerRecordStart audioConsumer close", audioConsumerId); console.info("关闭服务端录像音频消费者", audioConsumerId);
room.consumers.delete(audioConsumerId); room.consumers.delete(audioConsumerId);
}); });
console.debug("controlServerRecordStart audio", audioTransportId, audioConsumerId, audioTransport.tuple, audioRtpParameters); console.debug("创建服务器录像音频消费者", audioTransportId, audioConsumerId, audioTransport.tuple, audioRtpParameters);
} }
if(videoProducerId) { if(videoProducerId) {
const videoTransport = await room.mediasoupRouter.createPlainTransport(plainTransportOptions); const videoTransport = await room.mediasoupRouter.createPlainTransport(plainTransportOptions);
@@ -720,10 +721,10 @@ class Taoyao {
videoConsumer.streamId = videoStreamId; videoConsumer.streamId = videoStreamId;
room.consumers.set(videoConsumerId, videoConsumer); room.consumers.set(videoConsumerId, videoConsumer);
videoConsumer.observer.on("close", () => { videoConsumer.observer.on("close", () => {
console.debug("controlServerRecordStart videoConsumer close", videoConsumerId); console.info("关闭服务器录像视频消费者", videoConsumerId);
room.consumers.delete(videoConsumerId); room.consumers.delete(videoConsumerId);
}); });
console.debug("controlServerRecordStart video", videoTransportId, videoConsumerId, videoTransport.tuple, videoRtpParameters); console.debug("创建服务器录像视频消费者", videoTransportId, videoConsumerId, videoTransport.tuple, videoRtpParameters);
} }
if(audioConsumer) { if(audioConsumer) {
await audioConsumer.resume(); await audioConsumer.resume();
@@ -770,7 +771,7 @@ class Taoyao {
} }
// 判断文件大小验证是否已经开始录像:创建文件 -> 视频信息 -> 视频数据 -> 封装视频 // 判断文件大小验证是否已经开始录像:创建文件 -> 视频信息 -> 视频数据 -> 封装视频
if(fs.existsSync(filepath) && fs.statSync(filepath).size >= requestKeyFrameFileSize) { if(fs.existsSync(filepath) && fs.statSync(filepath).size >= requestKeyFrameFileSize) {
console.debug("请求录像关键帧已经开始录像", filepath); console.info("请求录像关键帧已经开始录像", filepath);
return; return;
} }
console.debug("请求录像关键帧", filepath, index); console.debug("请求录像关键帧", filepath, index);
@@ -780,12 +781,21 @@ class Taoyao {
}, 1000); }, 1000);
} }
// TODOcontinue /**
* 结束服务端录像
*
* @param {*} message 消息
* @param {*} body 消息主体
* @param {*} room 房间
*/
async controlServerRecordStop(message, body, room) { async controlServerRecordStop(message, body, room) {
const me = this; const me = this;
const { audioStreamId, videoStreamId, audioConsumerId, videoConsumerId, audioTransportId, videoTransportId } = body; const {
console.info("服务端结束录像", audioStreamId, videoStreamId); audioStreamId, videoStreamId,
audioConsumerId, videoConsumerId,
audioTransportId, videoTransportId
} = body;
console.info("结束服务端录像", audioStreamId, videoStreamId);
const audioConsumer = room.consumers.get(audioConsumerId); const audioConsumer = room.consumers.get(audioConsumerId);
if(audioConsumer) { if(audioConsumer) {
audioConsumer.close(); audioConsumer.close();
@@ -815,28 +825,37 @@ class Taoyao {
const me = this; const me = this;
const { roomId, transportId } = body; const { roomId, transportId } = body;
const room = me.rooms.get(roomId); const room = me.rooms.get(roomId);
const transport = room.transports.get(transportId); const transport = room?.transports.get(transportId);
const iceParameters = await transport.restartIce(); const iceParameters = await transport.restartIce();
message.body.iceParameters = iceParameters; message.body.iceParameters = iceParameters;
me.push(message); me.push(message);
} }
/**
* 生产媒体信令
*
* @param {*} message 消息
* @param {*} body 消息主体
*/
async mediaProduce(message, body) { async mediaProduce(message, body) {
const self = this; const me = this;
const { const {
kind, kind,
roomId, roomId,
clientId, clientId,
streamId, streamId,
appData,
transportId, transportId,
rtpParameters, appData,
rtpParameters
} = body; } = body;
const room = self.rooms.get(roomId); const room = me.rooms.get(roomId);
const transport = room.transports.get(transportId); const transport = room?.transports.get(transportId);
if(!transport) {
console.warn("生成媒体通道无效", roomId, transportId);
return;
}
const producer = await transport.produce({ const producer = await transport.produce({
kind, kind,
appData,
rtpParameters, rtpParameters,
// 关键帧延迟时间 // 关键帧延迟时间
// keyFrameRequestDelay: 5000 // keyFrameRequestDelay: 5000
@@ -845,80 +864,88 @@ class Taoyao {
producer.streamId = streamId; producer.streamId = streamId;
room.producers.set(producer.id, producer); room.producers.set(producer.id, producer);
producer.on("transportclose", () => { producer.on("transportclose", () => {
console.info("producer transportclose", producer.id); console.info("生产者关闭(通道关闭)", producer.id, streamId);
producer.close(); producer.close();
}); });
producer.on("score", (score) => {
console.info("producer score", producer.id, score);
self.push(
protocol.buildMessage("media::producer::score", {
score: score,
roomId: roomId,
producerId: producer.id,
})
);
});
producer.on("videoorientationchange", (videoOrientation) => {
console.info("producer videoorientationchange", producer.id, videoOrientation);
self.push(protocol.buildMessage("media::video::orientation::change", {
...videoOrientation,
roomId: roomId,
}));
});
// await producer.enableTraceEvent([ 'rtp', 'keyframe', 'nack', 'pli', 'fir' ]);
// producer.on("trace", (trace) => {
// console.info("producer trace", producer.id, trace);
// });
producer.observer.on("close", () => { producer.observer.on("close", () => {
if(room.producers.delete(producer.id)) { if(room.producers.delete(producer.id)) {
console.info("producer close", producer.id); console.info("生产者关闭", producer.id, streamId);
this.push( this.push(
protocol.buildMessage("media::producer::close", { protocol.buildMessage("media::producer::close", {
roomId: roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
}) })
); );
} else { } else {
console.info("producer close non", producer.id); console.info("生产者关闭(无效)", producer.id, streamId);
} }
}); });
producer.observer.on("pause", () => { producer.observer.on("pause", () => {
console.info("producer pause", producer.id); console.debug("生产者暂停", producer.id, streamId);
this.push( this.push(
protocol.buildMessage("media::producer::pause", { protocol.buildMessage("media::producer::pause", {
roomId: roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
}) })
); );
}); });
producer.observer.on("resume", () => { producer.observer.on("resume", () => {
console.info("producer resume", producer.id); console.debug("生产者恢复", producer.id, streamId);
this.push( this.push(
protocol.buildMessage("media::producer::resume", { protocol.buildMessage("media::producer::resume", {
roomId: roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
}) })
); );
}); });
// producer.observer.on("score", fn(score)); // producer.observer.on("score", fn(score));
producer.on("score", (score) => {
console.debug("生产者评分", producer.id, streamId, score);
me.push(
protocol.buildMessage("media::producer::score", {
score : score,
roomId : roomId,
producerId: producer.id,
})
);
});
// producer.observer.on("videoorientationchange", fn(videoOrientation)); // producer.observer.on("videoorientationchange", fn(videoOrientation));
producer.on("videoorientationchange", (videoOrientation) => {
console.debug("生产者视频方向改变", producer.id, streamId, videoOrientation);
me.push(
protocol.buildMessage("media::video::orientation::change", {
...videoOrientation,
roomId: roomId,
})
);
});
// await producer.enableTraceEvent([ 'pli', 'fir', 'rtp', 'nack', 'keyframe' ]);
// producer.observer.on("trace", fn(trace)); // producer.observer.on("trace", fn(trace));
message.body = { kind: kind, roomId: roomId, producerId: producer.id }; // producer.on("trace", (trace) => {
// console.debug("生产者跟踪", producer.id, trace);
// });
message.body = {
kind : kind,
roomId : roomId,
producerId: producer.id
};
this.push(message); this.push(message);
if (producer.kind === "audio") { if (producer.kind === "audio") {
room.audioLevelObserver room.audioLevelObserver
.addProducer({ producerId: producer.id }) .addProducer({ producerId: producer.id })
.catch((error) => { .catch((error) => {
console.error("音量监听异常", error); console.error("音量监听异常", error);
}); });
room.activeSpeakerObserver room.activeSpeakerObserver
.addProducer({ producerId: producer.id }) .addProducer({ producerId: producer.id })
.catch((error) => { .catch((error) => {
console.error("声音监听异常", error); console.error("声音监听异常", error);
}); });
} }
} }
// TODO:continue
/** /**
* 关闭生产者信令 * 关闭生产者信令
* *
@@ -926,10 +953,7 @@ class Taoyao {
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProducerClose(message, body) { async mediaProducerClose(message, body) {
const { const { roomId, producerId } = body;
roomId,
producerId,
} = body;
const room = this.rooms.get(roomId); const room = this.rooms.get(roomId);
const producer = room?.producers.get(producerId); const producer = room?.producers.get(producerId);
if(producer) { if(producer) {
@@ -947,10 +971,7 @@ class Taoyao {
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProducerPause(message, body) { async mediaProducerPause(message, body) {
const { const { roomId, producerId } = body;
roomId,
producerId,
} = body;
const room = this.rooms.get(roomId); const room = this.rooms.get(roomId);
const producer = room.producers.get(producerId); const producer = room.producers.get(producerId);
if(producer) { if(producer) {
@@ -968,10 +989,7 @@ class Taoyao {
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProducerResume(message, body) { async mediaProducerResume(message, body) {
const { const { roomId, producerId } = body;
roomId,
producerId,
} = body;
const room = this.rooms.get(roomId); const room = this.rooms.get(roomId);
const producer = room.producers.get(producerId); const producer = room.producers.get(producerId);
if(producer) { if(producer) {
@@ -990,6 +1008,7 @@ class Taoyao {
streamId, streamId,
producerId, producerId,
transportId, transportId,
appData,
rtpCapabilities, rtpCapabilities,
} = body; } = body;
const room = this.rooms.get(roomId); const room = this.rooms.get(roomId);
@@ -1170,7 +1189,6 @@ class Taoyao {
})() })()
); );
} }
try { try {
await Promise.all(promises); await Promise.all(promises);
} catch (error) { } catch (error) {
@@ -1263,7 +1281,12 @@ class Taoyao {
*/ */
async mediaConsumerSetPreferredLayers(message, body) { async mediaConsumerSetPreferredLayers(message, body) {
const me = this; const me = this;
const { roomId, consumerId, spatialLayer, temporalLayer } = body; const {
roomId,
consumerId,
spatialLayer,
temporalLayer
} = body;
const room = this.rooms.get(roomId); const room = this.rooms.get(roomId);
const consumer = room?.consumers.get(consumerId); const consumer = room?.consumers.get(consumerId);
if(consumer) { if(consumer) {
@@ -1453,22 +1476,6 @@ class Taoyao {
} }
} }
/**
* 重启ICE信令
*
* @param {*} message 消息
* @param {*} body 消息主体
*/
async mediaIceRestart(message, body) {
const me = this;
const { roomId, transportId } = body;
const room = this.rooms.get(roomId);
const transport = room?.transports.get(transportId);
const iceParameters = await transport.restartIce();
message.body.iceParameters = iceParameters;
me.push(message);
}
/** /**
* 路由RTP协商信令 * 路由RTP协商信令
* *
@@ -1508,7 +1515,14 @@ class Taoyao {
*/ */
async mediaTransportPlain(message, body) { async mediaTransportPlain(message, body) {
const me = this; const me = this;
const { roomId, rtcpMux, comedia, clientId, enableSctp, numSctpStreams, enableSrtp, srtpCryptoSuite } = body; const {
roomId,
clientId,
rtcpMux,
comedia,
enableSctp, numSctpStreams,
enableSrtp, srtpCryptoSuite
} = body;
const plainTransportOptions = { const plainTransportOptions = {
...config.mediasoup.plainTransportOptions, ...config.mediasoup.plainTransportOptions,
rtcpMux : rtcpMux, rtcpMux : rtcpMux,