[*] 精简流程
This commit is contained in:
@@ -35,7 +35,9 @@ import java.util.function.Consumer;
|
|||||||
* P2P终端
|
* P2P终端
|
||||||
* 使用安卓SDK + WebRTC实现P2P会话
|
* 使用安卓SDK + WebRTC实现P2P会话
|
||||||
*
|
*
|
||||||
* https://zhuanlan.zhihu.com/p/82446482
|
* 注意:
|
||||||
|
* 2. offer/answer/candidate枚举大小
|
||||||
|
* 1. candidate格式安卓和浏览器格式不同
|
||||||
*
|
*
|
||||||
* @author acgist
|
* @author acgist
|
||||||
*/
|
*/
|
||||||
@@ -56,10 +58,6 @@ public class SessionClient extends Client {
|
|||||||
private final boolean videoProduce;
|
private final boolean videoProduce;
|
||||||
private final MediaProperties mediaProperties;
|
private final MediaProperties mediaProperties;
|
||||||
private final WebrtcProperties webrtcProperties;
|
private final WebrtcProperties webrtcProperties;
|
||||||
/**
|
|
||||||
* 是否已经提供本地媒体
|
|
||||||
*/
|
|
||||||
private volatile boolean offerLocal;
|
|
||||||
/**
|
/**
|
||||||
* 本地媒体
|
* 本地媒体
|
||||||
*/
|
*/
|
||||||
@@ -168,10 +166,6 @@ public class SessionClient extends Client {
|
|||||||
* 提供媒体服务
|
* 提供媒体服务
|
||||||
*/
|
*/
|
||||||
public synchronized void offer() {
|
public synchronized void offer() {
|
||||||
if(this.offerLocal) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.offerLocal = true;
|
|
||||||
final MediaConstraints mediaConstraints = this.mediaManager.buildMediaConstraints();
|
final MediaConstraints mediaConstraints = this.mediaManager.buildMediaConstraints();
|
||||||
this.peerConnection.createOffer(this.sdpObserver(
|
this.peerConnection.createOffer(this.sdpObserver(
|
||||||
"主动Offer",
|
"主动Offer",
|
||||||
@@ -179,9 +173,7 @@ public class SessionClient extends Client {
|
|||||||
this.peerConnection.setLocalDescription(this.sdpObserver(
|
this.peerConnection.setLocalDescription(this.sdpObserver(
|
||||||
"主动OfferExchange",
|
"主动OfferExchange",
|
||||||
null,
|
null,
|
||||||
() -> {
|
() -> this.exchangeSessionDescription(sessionDescription)
|
||||||
this.exchangeSessionDescription(sessionDescription);
|
|
||||||
}
|
|
||||||
), sessionDescription);
|
), sessionDescription);
|
||||||
},
|
},
|
||||||
null
|
null
|
||||||
@@ -202,10 +194,7 @@ public class SessionClient extends Client {
|
|||||||
this.peerConnection.setLocalDescription(this.sdpObserver(
|
this.peerConnection.setLocalDescription(this.sdpObserver(
|
||||||
"主动AnswerExchange",
|
"主动AnswerExchange",
|
||||||
null,
|
null,
|
||||||
() -> {
|
() -> this.exchangeSessionDescription(sessionDescription)
|
||||||
this.exchangeSessionDescription(sessionDescription);
|
|
||||||
this.offer();
|
|
||||||
}
|
|
||||||
), sessionDescription);
|
), sessionDescription);
|
||||||
},
|
},
|
||||||
null
|
null
|
||||||
@@ -221,15 +210,14 @@ public class SessionClient extends Client {
|
|||||||
"被动Answer",
|
"被动Answer",
|
||||||
null,
|
null,
|
||||||
null
|
null
|
||||||
// () -> this.offer()
|
|
||||||
), new SessionDescription(sdpType, sdp));
|
), new SessionDescription(sdpType, sdp));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void candidate(Message message, Map<String, Object> body) {
|
private void candidate(Message message, Map<String, Object> body) {
|
||||||
final Map<String, Object> candidate = MapUtils.get(body, "candidate");
|
final Map<String, Object> candidate = MapUtils.get(body, "candidate");
|
||||||
final String sdp = MapUtils.get(candidate, "candidate");
|
final String sdp = MapUtils.get(candidate, "candidate");
|
||||||
final String sdpMid = MapUtils.get(candidate, "sdpMid");
|
final String sdpMid = MapUtils.get(candidate, "sdpMid");
|
||||||
final Integer sdpMLineIndex = MapUtils.getInteger(candidate, "sdpMLineIndex");
|
final Integer sdpMLineIndex = MapUtils.getInteger(candidate, "sdpMLineIndex");
|
||||||
if(sdp == null || sdpMid == null || sdpMLineIndex == null) {
|
if(sdp == null || sdpMid == null || sdpMLineIndex == null) {
|
||||||
Log.w(SessionClient.class.getSimpleName(), "无效媒体协商:" + body);
|
Log.w(SessionClient.class.getSimpleName(), "无效媒体协商:" + body);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -241,8 +241,6 @@ class Session {
|
|||||||
clientId;
|
clientId;
|
||||||
// 会话ID
|
// 会话ID
|
||||||
sessionId;
|
sessionId;
|
||||||
// 是否已经提供本地媒体
|
|
||||||
offerLocal;
|
|
||||||
// 本地媒体流
|
// 本地媒体流
|
||||||
localStream;
|
localStream;
|
||||||
// 本地音频
|
// 本地音频
|
||||||
@@ -266,7 +264,6 @@ class Session {
|
|||||||
this.closed = false;
|
this.closed = false;
|
||||||
this.clientId = clientId;
|
this.clientId = clientId;
|
||||||
this.sessionId = sessionId;
|
this.sessionId = sessionId;
|
||||||
this.offerLocal = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async pause() {
|
async pause() {
|
||||||
@@ -2151,7 +2148,6 @@ class Taoyao extends RemoteClient {
|
|||||||
this.sessionClients.set(sessionId, session);
|
this.sessionClients.set(sessionId, session);
|
||||||
await me.buildPeerConnection(session, sessionId);
|
await me.buildPeerConnection(session, sessionId);
|
||||||
session.peerConnection.createOffer().then(async description => {
|
session.peerConnection.createOffer().then(async description => {
|
||||||
session.offerLocal = true;
|
|
||||||
await session.peerConnection.setLocalDescription(description);
|
await session.peerConnection.setLocalDescription(description);
|
||||||
me.push(
|
me.push(
|
||||||
protocol.buildMessage("session::exchange", {
|
protocol.buildMessage("session::exchange", {
|
||||||
@@ -2199,18 +2195,6 @@ class Taoyao extends RemoteClient {
|
|||||||
sessionId: sessionId
|
sessionId: sessionId
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
if(!session.offerLocal) {
|
|
||||||
session.peerConnection.createOffer().then(async description => {
|
|
||||||
await session.peerConnection.setLocalDescription(description);
|
|
||||||
me.push(
|
|
||||||
protocol.buildMessage("session::exchange", {
|
|
||||||
sdp : description.sdp,
|
|
||||||
type : description.type,
|
|
||||||
sessionId: sessionId
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else if (type === "answer") {
|
} else if (type === "answer") {
|
||||||
await session.peerConnection.setRemoteDescription(new RTCSessionDescription(message.body));
|
await session.peerConnection.setRemoteDescription(new RTCSessionDescription(message.body));
|
||||||
|
|||||||
@@ -17,9 +17,31 @@ import com.acgist.taoyao.signal.protocol.ProtocolSessionAdapter;
|
|||||||
*/
|
*/
|
||||||
@Protocol
|
@Protocol
|
||||||
@Description(
|
@Description(
|
||||||
memo = "媒体交换协商:offer/answer/candidate",
|
memo = """
|
||||||
|
媒体交换协商:offer/answer/candidate
|
||||||
|
安卓需要注意:
|
||||||
|
1. 交换类型大小写
|
||||||
|
2. candidate内容默认名称sdp
|
||||||
|
""",
|
||||||
body = """
|
body = """
|
||||||
{
|
{
|
||||||
|
"sdp": "sdp"
|
||||||
|
"type": "offer",
|
||||||
|
"sessionId": "会话ID"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"sdp": "sdp"
|
||||||
|
"type": "answer",
|
||||||
|
"sessionId": "会话ID"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"type": "candidate",
|
||||||
|
"sessionId": "会话ID",
|
||||||
|
"candidate": {
|
||||||
|
"sdpMid": "sdpMid",
|
||||||
|
"candidate": "candidate信息",
|
||||||
|
"sdpMLineIndex":sdpMLineIndex
|
||||||
|
}
|
||||||
}
|
}
|
||||||
""",
|
""",
|
||||||
flow = "终端->信令服务->终端"
|
flow = "终端->信令服务->终端"
|
||||||
|
|||||||
Reference in New Issue
Block a user