[*] 日常优化
This commit is contained in:
@@ -533,10 +533,10 @@ sudo nginx -s reload
|
|||||||
cd /data/taoyao/taoyao-client-android/taoyao
|
cd /data/taoyao/taoyao-client-android/taoyao
|
||||||
|
|
||||||
# Mac | Linux
|
# Mac | Linux
|
||||||
sh ./gradlew --no-daemon assembleRelease
|
sh ./gradlew --no-daemon assembleRelease | installDebug | assembleDebug
|
||||||
|
|
||||||
# Windows
|
# Windows
|
||||||
./gradlew.bat --no-daemon assembleRelease
|
./gradlew.bat --no-daemon assembleRelease | installDebug | assembleDebug
|
||||||
```
|
```
|
||||||
|
|
||||||
## 防火墙
|
## 防火墙
|
||||||
|
|||||||
@@ -825,114 +825,6 @@ class Taoyao {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 生产媒体信令
|
|
||||||
*
|
|
||||||
* @param {*} message 消息
|
|
||||||
* @param {*} body 消息主体
|
|
||||||
*/
|
|
||||||
async mediaProduce(message, body) {
|
|
||||||
const {
|
|
||||||
kind,
|
|
||||||
roomId,
|
|
||||||
clientId,
|
|
||||||
streamId,
|
|
||||||
transportId,
|
|
||||||
appData,
|
|
||||||
rtpParameters
|
|
||||||
} = body;
|
|
||||||
const me = this;
|
|
||||||
const room = me.rooms.get(roomId);
|
|
||||||
const transport = room?.transports.get(transportId);
|
|
||||||
if(!transport) {
|
|
||||||
console.warn("生产媒体通道无效", roomId, transportId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const producer = await transport.produce({
|
|
||||||
kind,
|
|
||||||
appData,
|
|
||||||
rtpParameters,
|
|
||||||
// 关键帧延迟时间
|
|
||||||
// keyFrameRequestDelay: 5000
|
|
||||||
});
|
|
||||||
producer.clientId = clientId;
|
|
||||||
producer.streamId = streamId;
|
|
||||||
room.producers.set(producer.id, producer);
|
|
||||||
console.debug("创建生产者", producer.id, streamId);
|
|
||||||
producer.on("transportclose", () => {
|
|
||||||
console.info("生产者关闭(通道关闭)", producer.id, streamId);
|
|
||||||
producer.close();
|
|
||||||
});
|
|
||||||
producer.observer.on("close", () => {
|
|
||||||
if(room.producers.delete(producer.id)) {
|
|
||||||
console.debug("生产者关闭", producer.id, streamId);
|
|
||||||
me.push(protocol.buildMessage("media::producer::close", {
|
|
||||||
roomId,
|
|
||||||
producerId: producer.id
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
console.debug("生产者关闭(生产者无效)", producer.id, streamId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
producer.observer.on("pause", () => {
|
|
||||||
console.debug("生产者暂停", producer.id, streamId);
|
|
||||||
me.push(protocol.buildMessage("media::producer::pause", {
|
|
||||||
roomId,
|
|
||||||
producerId: producer.id
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
producer.observer.on("resume", () => {
|
|
||||||
console.debug("生产者恢复", producer.id, streamId);
|
|
||||||
me.push(protocol.buildMessage("media::producer::resume", {
|
|
||||||
roomId,
|
|
||||||
producerId: producer.id
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
// producer.observer.on("score", fn(score));
|
|
||||||
producer.on("score", (score) => {
|
|
||||||
console.debug("生产者评分", producer.id, streamId, score);
|
|
||||||
me.push(protocol.buildMessage("media::producer::score", {
|
|
||||||
score,
|
|
||||||
roomId,
|
|
||||||
producerId: producer.id,
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
// 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.on("trace", (trace) => {
|
|
||||||
// console.debug("生产者跟踪事件(trace)", producer.id, streamId, trace);
|
|
||||||
// });
|
|
||||||
message.body = {
|
|
||||||
kind : kind,
|
|
||||||
roomId : roomId,
|
|
||||||
producerId: producer.id
|
|
||||||
};
|
|
||||||
me.push(message);
|
|
||||||
if (producer.kind === "audio") {
|
|
||||||
// TODO:关闭生产者时移除监听
|
|
||||||
room.audioLevelObserver
|
|
||||||
.addProducer({ producerId: producer.id })
|
|
||||||
.catch((error) => {
|
|
||||||
console.error("音量监听异常", error);
|
|
||||||
});
|
|
||||||
room.activeSpeakerObserver
|
|
||||||
.addProducer({ producerId: producer.id })
|
|
||||||
.catch((error) => {
|
|
||||||
console.error("声音监听异常", error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 消费媒体信令
|
* 消费媒体信令
|
||||||
*
|
*
|
||||||
@@ -1484,6 +1376,126 @@ class Taoyao {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生产媒体信令
|
||||||
|
*
|
||||||
|
* @param {*} message 信令消息
|
||||||
|
* @param {*} body 消息主体
|
||||||
|
*/
|
||||||
|
async mediaProduce(message, body) {
|
||||||
|
const {
|
||||||
|
kind,
|
||||||
|
roomId,
|
||||||
|
clientId,
|
||||||
|
streamId,
|
||||||
|
transportId,
|
||||||
|
appData,
|
||||||
|
rtpParameters
|
||||||
|
} = body;
|
||||||
|
const room = this.rooms.get(roomId);
|
||||||
|
const transport = room?.transports.get(transportId);
|
||||||
|
if(!transport) {
|
||||||
|
console.warn("生产媒体(通道无效)", roomId, transportId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const producer = await transport.produce({
|
||||||
|
kind,
|
||||||
|
appData,
|
||||||
|
rtpParameters,
|
||||||
|
// 关键帧延迟时间
|
||||||
|
// keyFrameRequestDelay: 5000
|
||||||
|
});
|
||||||
|
producer.clientId = clientId;
|
||||||
|
producer.streamId = streamId;
|
||||||
|
room.producers.set(producer.id, producer);
|
||||||
|
console.debug("创建生产者", producer.id, streamId);
|
||||||
|
producer.on("transportclose", () => {
|
||||||
|
console.debug("生产者关闭(通道关闭)", producer.id, streamId);
|
||||||
|
producer.close();
|
||||||
|
});
|
||||||
|
producer.observer.on("close", () => {
|
||||||
|
if(room.producers.delete(producer.id)) {
|
||||||
|
console.debug("生产者关闭", producer.id, streamId);
|
||||||
|
// 生产者关闭时自动删除
|
||||||
|
// if(producer.kind === "audio") {
|
||||||
|
// room.audioLevelObserver
|
||||||
|
// .removeProducer({ producerId: producer.id })
|
||||||
|
// .then(() => console.debug("删除音量监听", clientId, streamId))
|
||||||
|
// .catch((error) => {
|
||||||
|
// console.error("删除音量监听", clientId, streamId, error);
|
||||||
|
// });
|
||||||
|
// room.activeSpeakerObserver
|
||||||
|
// .removeProducer({ producerId: producer.id })
|
||||||
|
// .then(() => console.debug("删除声音监听", clientId, streamId))
|
||||||
|
// .catch((error) => {
|
||||||
|
// console.error("删除声音监听", clientId, streamId, error);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
this.push(protocol.buildMessage("media::producer::close", {
|
||||||
|
roomId,
|
||||||
|
producerId: producer.id
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
console.debug("生产者关闭(生产者无效)", producer.id, streamId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
producer.observer.on("pause", () => {
|
||||||
|
console.debug("生产者暂停", producer.id, streamId);
|
||||||
|
this.push(protocol.buildMessage("media::producer::pause", {
|
||||||
|
roomId,
|
||||||
|
producerId: producer.id
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
producer.observer.on("resume", () => {
|
||||||
|
console.debug("生产者恢复", producer.id, streamId);
|
||||||
|
this.push(protocol.buildMessage("media::producer::resume", {
|
||||||
|
roomId,
|
||||||
|
producerId: producer.id
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
// producer.observer.on("score", fn(score));
|
||||||
|
producer.on("score", (score) => {
|
||||||
|
console.debug("生产者评分", producer.id, streamId, score);
|
||||||
|
this.push(protocol.buildMessage("media::producer::score", {
|
||||||
|
score,
|
||||||
|
roomId,
|
||||||
|
producerId: producer.id,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
// producer.observer.on("videoorientationchange", fn(videoOrientation));
|
||||||
|
producer.on("videoorientationchange", (videoOrientation) => {
|
||||||
|
console.debug("生产者视频方向改变", producer.id, streamId, videoOrientation);
|
||||||
|
this.push(protocol.buildMessage("media::video::orientation::change", {
|
||||||
|
...videoOrientation,
|
||||||
|
roomId,
|
||||||
|
producerId: producer.id,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
// await producer.enableTraceEvent([ 'pli', 'fir', 'rtp', 'nack', 'keyframe' ]);
|
||||||
|
// producer.observer.on("trace", fn(trace));
|
||||||
|
// producer.on("trace", (trace) => {
|
||||||
|
// console.debug("生产者跟踪事件(trace)", producer.id, streamId, trace);
|
||||||
|
// });
|
||||||
|
message.body = {
|
||||||
|
kind : kind,
|
||||||
|
roomId : roomId,
|
||||||
|
producerId: producer.id
|
||||||
|
};
|
||||||
|
this.push(message);
|
||||||
|
if (producer.kind === "audio") {
|
||||||
|
room.audioLevelObserver
|
||||||
|
.addProducer({ producerId: producer.id })
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("音量监听异常", error);
|
||||||
|
});
|
||||||
|
room.activeSpeakerObserver
|
||||||
|
.addProducer({ producerId: producer.id })
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("声音监听异常", error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 关闭生产者信令
|
* 关闭生产者信令
|
||||||
*
|
*
|
||||||
@@ -1807,7 +1819,7 @@ class Taoyao {
|
|||||||
// transport.observer.on("newconsumer", (consumer) => {});
|
// transport.observer.on("newconsumer", (consumer) => {});
|
||||||
// transport.observer.on("newdataproducer", (dataProducer) => {});
|
// transport.observer.on("newdataproducer", (dataProducer) => {});
|
||||||
// transport.observer.on("newdataconsumer", (dataConsumer) => {});
|
// transport.observer.on("newdataconsumer", (dataConsumer) => {});
|
||||||
// 设置追踪信息
|
// 设置跟踪事件
|
||||||
// await transport.enableTraceEvent([ 'bwe', 'probation' ]);
|
// await transport.enableTraceEvent([ 'bwe', 'probation' ]);
|
||||||
// transport.on("trace", (trace) => {});
|
// transport.on("trace", (trace) => {});
|
||||||
// transport.observer.on("trace", fn(trace));
|
// transport.observer.on("trace", fn(trace));
|
||||||
|
|||||||
@@ -29,10 +29,17 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
"""
|
"""
|
||||||
{
|
{
|
||||||
"kind" : "媒体类型",
|
"kind" : "媒体类型",
|
||||||
"roomId" : "房间标识",
|
"roomId" : "房间ID",
|
||||||
"transportId" : "通道标识",
|
"transportId" : "通道ID",
|
||||||
"rtpParameters": "rtpParameters"
|
"rtpParameters": "rtpParameters"
|
||||||
}
|
}
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
{
|
||||||
|
"kind" : "媒体类型",
|
||||||
|
"roomId" : "房间ID",
|
||||||
|
"producerId": "生产者ID",
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
},
|
},
|
||||||
flow = "终端=>信令服务->媒体服务"
|
flow = "终端=>信令服务->媒体服务"
|
||||||
@@ -48,26 +55,26 @@ public class MediaProduceProtocol extends ProtocolRoomAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map<String, Object> body) {
|
public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map<String, Object> body) {
|
||||||
if(clientType.isClient()) {
|
if(clientType.isClient()) {
|
||||||
final String kind = MapUtils.get(body, Constant.KIND);
|
final String kind = MapUtils.get(body, Constant.KIND);
|
||||||
final String streamId = Constant.STREAM_ID_PRODUCER.apply(kind, clientId);
|
final String streamId = Constant.STREAM_ID_PRODUCER.apply(kind, clientId);
|
||||||
body.put(Constant.CLIENT_ID, clientId);
|
body.put(Constant.CLIENT_ID, clientId);
|
||||||
body.put(Constant.STREAM_ID, streamId);
|
body.put(Constant.STREAM_ID, streamId);
|
||||||
final Message response = room.requestMedia(message);
|
final Message response = room.requestMedia(message);
|
||||||
final Map<String, Object> responseBody = response.body();
|
final Map<String, Object> responseBody = response.body();
|
||||||
final String producerId = MapUtils.get(responseBody, Constant.PRODUCER_ID);
|
final String producerId = MapUtils.get(responseBody, Constant.PRODUCER_ID);
|
||||||
final ClientWrapper producerClientWrapper = room.clientWrapper(client);
|
final ClientWrapper producerClientWrapper = room.clientWrapper(client);
|
||||||
final Map<String, Producer> roomProducers = room.getProducers();
|
final Map<String, Producer> roomProducers = room.getProducers();
|
||||||
final Map<String, Producer> clientProducers = producerClientWrapper.getProducers();
|
final Map<String, Producer> clientProducers = producerClientWrapper.getProducers();
|
||||||
final Producer producer = new Producer(kind, streamId, producerId, room, producerClientWrapper);
|
final Producer producer = new Producer(kind, streamId, producerId, room, producerClientWrapper);
|
||||||
final Producer oldRoomProducer = roomProducers.put(producerId, producer);
|
final Producer oldRoomProducer = roomProducers.put(producerId, producer);
|
||||||
final Producer oldClientProducer = clientProducers.put(producerId, producer);
|
final Producer oldClientProducer = clientProducers.put(producerId, producer);
|
||||||
if(oldRoomProducer != null || oldClientProducer != null) {
|
if(oldRoomProducer != null || oldClientProducer != null) {
|
||||||
log.warn("生产者已经存在:{}", producerId);
|
log.warn("生产者已经存在:{}", producerId);
|
||||||
}
|
}
|
||||||
final Message responseMessage = response.cloneWithoutBody();
|
final Message responseMessage = response.cloneWithoutBody();
|
||||||
responseMessage.setBody(Map.of(
|
responseMessage.setBody(Map.of(
|
||||||
Constant.KIND, kind,
|
Constant.KIND, kind,
|
||||||
Constant.STREAM_ID, streamId,
|
Constant.STREAM_ID, streamId,
|
||||||
Constant.PRODUCER_ID, producerId
|
Constant.PRODUCER_ID, producerId
|
||||||
));
|
));
|
||||||
client.push(responseMessage);
|
client.push(responseMessage);
|
||||||
|
|||||||
@@ -19,10 +19,11 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter;
|
|||||||
@Description(
|
@Description(
|
||||||
body = """
|
body = """
|
||||||
{
|
{
|
||||||
"roomId" : "房间ID",
|
"roomId" : "房间ID",
|
||||||
"flip" : "是否翻转",
|
"producerId": "生产者ID",
|
||||||
"camera" : "是否摄像头",
|
"flip" : "是否翻转",
|
||||||
"rotation": "旋转角度"
|
"camera" : "是否摄像头",
|
||||||
|
"rotation" : "旋转角度"
|
||||||
}
|
}
|
||||||
""",
|
""",
|
||||||
flow = "媒体服务->信令服务->终端"
|
flow = "媒体服务->信令服务->终端"
|
||||||
|
|||||||
Reference in New Issue
Block a user