[*] 日常优化

This commit is contained in:
acgist
2024-01-02 07:18:41 +08:00
parent 83d9f260e9
commit 4a7c3d12cc
3 changed files with 81 additions and 70 deletions

View File

@@ -20,6 +20,10 @@
> 注意删除目录`build`目录和`third_party`目录中除了`abseil-cpp`以外的所有依赖(当然不删也没关系就是文件太多编译器会变慢) > 注意删除目录`build`目录和`third_party`目录中除了`abseil-cpp`以外的所有依赖(当然不删也没关系就是文件太多编译器会变慢)
## 录像优化
改为`surface`实现性能更高
## 视频旋转 ## 视频旋转
1. 应用旋转:横屏竖屏 1. 应用旋转:横屏竖屏

View File

@@ -118,20 +118,21 @@ module.exports = {
clockRate : 90000, clockRate : 90000,
parameters: { parameters: {
"packetization-mode" : 1, "packetization-mode" : 1,
"profile-level-id" : "4d0032", "profile-level-id" : "42e01f",
"level-asymmetry-allowed": 1, "level-asymmetry-allowed": 1,
"x-google-start-bitrate" : 400, "x-google-start-bitrate" : 400,
// "x-google-min-bitrate": 800, // "x-google-min-bitrate": 800,
// "x-google-max-bitrate": 1600, // "x-google-max-bitrate": 1600,
}, },
}, },
// 安卓H5失败
{ {
kind : "video", kind : "video",
mimeType : "video/h264", mimeType : "video/h264",
clockRate : 90000, clockRate : 90000,
parameters: { parameters: {
"packetization-mode" : 1, "packetization-mode" : 1,
"profile-level-id" : "42e01f", "profile-level-id" : "4d0032",
"level-asymmetry-allowed": 1, "level-asymmetry-allowed": 1,
"x-google-start-bitrate" : 400, "x-google-start-bitrate" : 400,
// "x-google-min-bitrate": 800, // "x-google-min-bitrate": 800,

View File

@@ -271,6 +271,7 @@ class Room {
this.handleAudioLevelObserver(); this.handleAudioLevelObserver();
this.handleActiveSpeakerObserver(); this.handleActiveSpeakerObserver();
} }
/** /**
* 音量监控 * 音量监控
*/ */
@@ -302,6 +303,7 @@ class Room {
}); });
// this.audioLevelObserver.observer.on("volumes", (volumes) => {}); // this.audioLevelObserver.observer.on("volumes", (volumes) => {});
} }
/** /**
* 当前讲话终端监控 * 当前讲话终端监控
*/ */
@@ -313,44 +315,45 @@ class Room {
}); });
// this.activeSpeakerObserver.observer.on("dominantspeaker", (dominantSpeaker) => {}); // this.activeSpeakerObserver.observer.on("dominantspeaker", (dominantSpeaker) => {});
} }
/** /**
* 房间使用情况 * 房间使用情况
*/ */
usage() { usage() {
const me = this; console.info("房间标识", this.roomId);
console.info("房间标识", me.roomId); console.info("房间媒体通道数量", this.transports.size);
console.info("房间媒体通道数量", me.transports.size); console.info("房间媒体生产者数量", this.producers.size);
console.info("房间媒体生产者数量", me.producers.size); console.info("房间媒体消费者数量", this.consumers.size);
console.info("房间媒体消费者数量", me.consumers.size); console.info("房间数据生产者数量", this.dataProducers.size);
console.info("房间数据生产者数量", me.dataProducers.size); console.info("房间数据消费者数量", this.dataConsumers.size);
console.info("房间数据消费者数量", me.dataConsumers.size);
} }
/** /**
* 关闭房间 * 关闭房间
*/ */
closeAll() { closeAll() {
const me = this; if (this.close) {
if (me.close) {
return; return;
} }
console.info("关闭房间", me.roomId); console.info("关闭房间", this.roomId);
me.close = true; this.close = true;
me.audioLevelObserver.close(); this.audioLevelObserver.close();
me.activeSpeakerObserver.close(); this.activeSpeakerObserver.close();
me.consumers.forEach(v => v.close()); this.consumers.forEach(v => v.close());
me.producers.forEach(v => v.close()); this.producers.forEach(v => v.close());
me.dataConsumers.forEach(v => v.close()); this.dataConsumers.forEach(v => v.close());
me.dataProducers.forEach(v => v.close()); this.dataProducers.forEach(v => v.close());
me.transports.forEach(v => v.close()); this.transports.forEach(v => v.close());
me.mediasoupRouter.close(); this.mediasoupRouter.close();
} }
}; };
/** /**
* 桃夭信令 * 桃夭信令
*/ */
class Taoyao { class Taoyao {
// 是否连接 // 是否连接
connect = false; connect = false;
// 房间列表房间ID=房间 // 房间列表房间ID=房间
@@ -377,119 +380,125 @@ class Taoyao {
* @param {*} message 消息 * @param {*} message 消息
*/ */
on(message) { on(message) {
const me = this;
// 解构 // 解构
const { code, header, body } = message; const {
const { id, signal } = header; code,
header,
body
} = message;
const {
id,
signal
} = header;
if(code !== "0000") { if(code !== "0000") {
console.warn("信令错误", message); console.warn("信令错误", message);
} }
// 请求回调 // 请求回调
if (me.callbackMapping.has(id)) { if (this.callbackMapping.has(id)) {
try { try {
me.callbackMapping.get(id)(message); this.callbackMapping.get(id)(message);
} finally { } finally {
me.callbackMapping.delete(id); this.callbackMapping.delete(id);
} }
return; return;
} }
// 执行信令 // 执行信令
switch (signal) { switch (signal) {
case "client::reboot": case "client::reboot":
me.clientReboot(message, body); this.clientReboot(message, body);
break; break;
case "client::shutdown": case "client::shutdown":
me.clientShutdown(message, body); this.clientShutdown(message, body);
break; break;
case "control::server::record": case "control::server::record":
me.controlServerRecord(message, body); this.controlServerRecord(message, body);
break; break;
case "media::consume": case "media::consume":
me.mediaConsume(message, body); this.mediaConsume(message, body);
break; break;
case "media::consumer::close": case "media::consumer::close":
me.mediaConsumerClose(message, body); this.mediaConsumerClose(message, body);
break; break;
case "media::consumer::pause": case "media::consumer::pause":
me.mediaConsumerPause(message, body); this.mediaConsumerPause(message, body);
break; break;
case "media::consumer::request::key::frame": case "media::consumer::request::key::frame":
me.mediaConsumerRequestKeyFrame(message, body); this.mediaConsumerRequestKeyFrame(message, body);
break; break;
case "media::consumer::resume": case "media::consumer::resume":
me.mediaConsumerResume(message, body); this.mediaConsumerResume(message, body);
break; break;
case "media::consumer::set::preferred::layers": case "media::consumer::set::preferred::layers":
me.mediaConsumerSetPreferredLayers(message, body); this.mediaConsumerSetPreferredLayers(message, body);
break; break;
case "media::consumer::set::priority": case "media::consumer::set::priority":
me.mediaConsumerSetPriority(message, body); this.mediaConsumerSetPriority(message, body);
break; break;
case "media::consumer::status": case "media::consumer::status":
me.mediaConsumerStatus(message, body); this.mediaConsumerStatus(message, body);
break; break;
case "media::data::consume": case "media::data::consume":
me.mediaDataConsume(message, body); this.mediaDataConsume(message, body);
break; break;
case "media::data::consumer::close": case "media::data::consumer::close":
me.mediaDataConsumerClose(message, body); this.mediaDataConsumerClose(message, body);
break; break;
case "media::data::consumer::status": case "media::data::consumer::status":
me.mediaDataConsumerStatus(message, body); this.mediaDataConsumerStatus(message, body);
break; break;
case "media::data::produce": case "media::data::produce":
me.mediaDataProduce(message, body); this.mediaDataProduce(message, body);
break; break;
case "media::data::producer::close": case "media::data::producer::close":
me.mediaDataProducerClose(message, body); this.mediaDataProducerClose(message, body);
break; break;
case "media::data::producer::status": case "media::data::producer::status":
me.mediaDataProducerStatus(message, body); this.mediaDataProducerStatus(message, body);
break; break;
case "media::ice::restart": case "media::ice::restart":
me.mediaIceRestart(message, body); this.mediaIceRestart(message, body);
break; break;
case "media::produce": case "media::produce":
me.mediaProduce(message, body); this.mediaProduce(message, body);
break; break;
case "media::producer::close": case "media::producer::close":
me.mediaProducerClose(message, body); this.mediaProducerClose(message, body);
break; break;
case "media::producer::pause": case "media::producer::pause":
me.mediaProducerPause(message, body); this.mediaProducerPause(message, body);
break; break;
case "media::producer::resume": case "media::producer::resume":
me.mediaProducerResume(message, body); this.mediaProducerResume(message, body);
break; break;
case "media::producer::status": case "media::producer::status":
me.mediaProducerStatus(message, body); this.mediaProducerStatus(message, body);
break; break;
case "media::router::rtp::capabilities": case "media::router::rtp::capabilities":
me.mediaRouterRtpCapabilities(message, body); this.mediaRouterRtpCapabilities(message, body);
break; break;
case "media::transport::close": case "media::transport::close":
me.mediaTransportClose(message, body); this.mediaTransportClose(message, body);
break; break;
case "media::transport::plain::create": case "media::transport::plain::create":
me.mediaTransportPlainCreate(message, body); this.mediaTransportPlainCreate(message, body);
break; break;
case "media::transport::status": case "media::transport::status":
me.mediaTransportStatus(message, body); this.mediaTransportStatus(message, body);
break; break;
case "media::transport::webrtc::connect": case "media::transport::webrtc::connect":
me.mediaTransportWebrtcConnect(message, body); this.mediaTransportWebrtcConnect(message, body);
break; break;
case "media::transport::webrtc::create": case "media::transport::webrtc::create":
me.mediaTransportWebrtcCreate(message, body); this.mediaTransportWebrtcCreate(message, body);
break; break;
case "platform::error": case "platform::error":
me.platformError(message, body); this.platformError(message, body);
break; break;
case "room::close": case "room::close":
me.roomClose(message, body); this.roomClose(message, body);
break; break;
case "room::create": case "room::create":
me.roomCreate(message, body); this.roomCreate(message, body);
break; break;
} }
} }
@@ -515,17 +524,16 @@ class Taoyao {
* @returns Promise * @returns Promise
*/ */
async request(message) { async request(message) {
const me = this;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const { header, body } = message; const { header, body } = message;
const { id } = header; const { id } = header;
// 设置超时 // 设置超时
const rejectTimeout = setTimeout(() => { const rejectTimeout = setTimeout(() => {
me.callbackMapping.delete(id); this.callbackMapping.delete(id);
reject("请求超时", message); reject("请求超时", message);
}, 5000); }, 5000);
// 请求回调 // 请求回调
me.callbackMapping.set(id, (response) => { this.callbackMapping.set(id, (response) => {
resolve(response); resolve(response);
clearTimeout(rejectTimeout); clearTimeout(rejectTimeout);
return true; return true;
@@ -543,23 +551,21 @@ class Taoyao {
* 打印日志 * 打印日志
*/ */
async usage() { async usage() {
const me = this; for (const worker of this.mediasoupWorkers) {
for (const worker of me.mediasoupWorkers) {
const usage = await worker.getResourceUsage(); const usage = await worker.getResourceUsage();
console.info("工作线程使用情况", worker.pid, usage); console.info("工作线程使用情况", worker.pid, usage);
} }
console.info("工作线程数量", me.mediasoupWorkers.length); console.info("工作线程数量", this.mediasoupWorkers.length);
console.info("现存房间数量", me.rooms.size); console.info("现存房间数量", this.rooms.size);
Array.from(me.rooms.values()).forEach((room) => room.usage()); Array.from(this.rooms.values()).forEach((room) => room.usage());
} }
/** /**
* @returns 下个工作线程 * @returns 下个工作线程
*/ */
nextMediasoupWorker() { nextMediasoupWorker() {
const me = this; const worker = this.mediasoupWorkers[this.nextMediasoupWorkerIndex];
const worker = me.mediasoupWorkers[me.nextMediasoupWorkerIndex]; this.nextMediasoupWorkerIndex = ++this.nextMediasoupWorkerIndex % this.mediasoupWorkers.length;
me.nextMediasoupWorkerIndex = ++me.nextMediasoupWorkerIndex % me.mediasoupWorkers.length;
return worker; return worker;
} }