[*] 日常优化
This commit is contained in:
@@ -20,6 +20,10 @@
|
|||||||
|
|
||||||
> 注意删除目录`build`目录和`third_party`目录中除了`abseil-cpp`以外的所有依赖(当然不删也没关系就是文件太多编译器会变慢)
|
> 注意删除目录`build`目录和`third_party`目录中除了`abseil-cpp`以外的所有依赖(当然不删也没关系就是文件太多编译器会变慢)
|
||||||
|
|
||||||
|
## 录像优化
|
||||||
|
|
||||||
|
改为`surface`实现性能更高
|
||||||
|
|
||||||
## 视频旋转
|
## 视频旋转
|
||||||
|
|
||||||
1. 应用旋转:横屏竖屏
|
1. 应用旋转:横屏竖屏
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user