当前位置:网站首页>webrtc入门:12.Kurento下的RtpEndpoint和WebrtcEndpoint
webrtc入门:12.Kurento下的RtpEndpoint和WebrtcEndpoint
2022-06-27 08:19:00 【go2coding】
在前面的一个章节,做kms
的集群时,引入了RtpEndpoint
,这个是一个新的类,我们之前使用的都是WebrtcEndpoint
,这两个类有什么区别呢?如果直接用WebrtcEndpoint
,能不能实现集群的连通呢。
我们来看看,文档中的关于几个重要的Endpoint
,继承图如下:
但是从详细的文档上来看,RtpEndpoint
和WebrtcEndpoint
都是继承BaseRtpEndpoint
的。
从文档上来看,RtpEndpoint
和WebrtcEndpoint
应该区别不大,因为他有一个共同的基类BaseRtpEndpoint
。
在对比下两者文档的区别:
RtpEndpoint
:WebRtcEndpoint
:
从文档上来看,RtpEndpoint
和WebrtcEndpoint
的区别在于 RtpEndpoint
可以直接通过SDP
就能完成相互的连接,WebrtcEndpoint
要实现连接,不仅仅需要SDP
还需要ICE
。
也就是RtpEndpoint
在设计的时候,就可以通过SDP
建立连接,那么在SDP
中必将包含着 IP
和端口的信息了。
在源代码kms_sdp_agent_create_offer_impl
中可以看到生成的SDP
,存在在相应的 IP
和端口信息。
v=0
o=- 3864705878 3864705878 IN IP4 192.168.100.130
s=Kurento Media Server
c=IN IP4 192.168.100.130
t=0 0
m=audio 5198 RTP/AVPF 96 0 97
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:96 opus/48000/2
a=rtpmap:97 AMR/8000
a=rtcp:5199
a=sendrecv
a=mid:audio0
a=ssrc:1665516295 cname:[email protected]
m=video 1420 RTP/AVPF 102 103
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:102 VP8/90000
a=rtpmap:103 H264/90000
a=fmtp:103 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtcp:1421
a=sendrecv
a=mid:video0
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 ccm fir
a=rtcp-fb:103 nack
a=rtcp-fb:103 nack pli
a=rtcp-fb:103 ccm fir
a=ssrc:2557383214 cname:[email protected]
这样两个 RtpEndpoint
就能够协商连接上。
而WebrtcEndpoint
中生成的SDP
,并没有包含IP
和端口信息,这一点可以继续的跟进kms_sdp_agent_create_offer_impl
,看看到底是为什么。这样的协议,是个浏览器的webrtc
一样样的。
那如果使用 WebrtcEndpoint
能否实现集群呢?应该是可以的,但是比起RtpEndpoint
自然会复杂一点,因为他涉及到 ICE
的步骤了。
如果也需要,可以用下面的代码进行实现。
private synchronized void presenter(final WebSocketSession session, JsonObject jsonMessage)
throws IOException {
if (presenterUserSession == null) {
presenterUserSession = new UserSession(session);
pipeline = kurento.createMediaPipeline();
presenterUserSession.setWebRtcEndpoint(new WebRtcEndpoint.Builder(pipeline).build());
WebRtcEndpoint presenterWebRtc = presenterUserSession.getWebRtcEndpoint();
pipeline_B = kurento.createMediaPipeline();
presenterUserSession.setWebRtcEndpoint_A(new WebRtcEndpoint.Builder(pipeline).build());
WebRtcEndpoint presenterWebRtc_A = presenterUserSession.getWebRtcEndpoint_A();
presenterUserSession.setWebRtcEndpoint_B(new WebRtcEndpoint.Builder(pipeline_B).build());
WebRtcEndpoint presenterWebRtc_B = presenterUserSession.getWebRtcEndpoint_B();
presenterUserSession.getWebRtcEndpoint().connect(presenterWebRtc_A);
String offerString = presenterWebRtc_A.generateOffer();
String sdpAnswerViewer = presenterWebRtc_B.processOffer(offerString);
presenterWebRtc_A.processAnswer(sdpAnswerViewer);
log.info(offerString);
presenterWebRtc_A.addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() {
@Override
public void onEvent(IceCandidateFoundEvent event) {
log.info("presenterWebRtc_A.addIceCandidateFoundListener");
presenterWebRtc_B.addIceCandidate(event.getCandidate());
}
});
presenterWebRtc_B.addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() {
@Override
public void onEvent(IceCandidateFoundEvent event) {
log.info("presenterWebRtc_B.addIceCandidateFoundListener");
//presenterWebRtc_A.addIceCandidate(event.getCandidate());
}
});
presenterWebRtc.addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() {
@Override
public void onEvent(IceCandidateFoundEvent event) {
JsonObject response = new JsonObject();
response.addProperty("id", "iceCandidate");
response.add("candidate", JsonUtils.toJsonObject(event.getCandidate()));
try {
synchronized (session) {
session.sendMessage(new TextMessage(response.toString()));
}
} catch (IOException e) {
log.debug(e.getMessage());
}
}
});
String sdpOffer = jsonMessage.getAsJsonPrimitive("sdpOffer").getAsString();
String sdpAnswer = presenterWebRtc.processOffer(sdpOffer);
JsonObject response = new JsonObject();
response.addProperty("id", "presenterResponse");
response.addProperty("response", "accepted");
response.addProperty("sdpAnswer", sdpAnswer);
synchronized (session) {
presenterUserSession.sendMessage(response);
}
presenterWebRtc.gatherCandidates();
presenterWebRtc_A.gatherCandidates();
presenterWebRtc_B.gatherCandidates();
} else {
JsonObject response = new JsonObject();
response.addProperty("id", "presenterResponse");
response.addProperty("response", "rejected");
response.addProperty("message",
"Another user is currently acting as sender. Try again later ...");
session.sendMessage(new TextMessage(response.toString()));
}
}
边栏推荐
- ZABBIX deployment instructions (server+win client + switch (H3C))
- 05 observer mode
- vim 从嫌弃到依赖(20)——global 命令
- Filter filter
- Redis transactions
- (original) custom drawable
- 若xn>0,且x(n+1)/xn>1-1/n(n=1,2,...),证明级数∑xn发散
- Ready to migrate to the cloud? Please accept this list of migration steps
- 八大误区,逐个击破(终篇):云难以扩展、定制性差,还会让管理员失去控制权?
- [notes on c++ primer] Chapter 3 string, vector and array
猜你喜欢
LVGL GUI GUIDER移植代码到STM32
正确的理解MySQL的MVCC
Redis五种基本类型
Preliminary understanding of C #
Rust async: SMOL source code analysis -executor
No matter how good LCD and OLED display technologies are, they cannot replace this ancient display nixie tube
lvgl使用demo及说明2
(note) Anaconda navigator flashback solution
Import and export database related tables from the win command line
Creation process and memory layout of objects at JVM level
随机推荐
野風藥業IPO被終止:曾擬募資5.4億 實控人俞蘠曾進行P2P投資
【批处理DOS-CMD命令-汇总和小结】-环境变量、路径变量、搜索文件位置相关指令——set、path、where,cmd命令的路径参数中有空格怎么办
淘宝虚拟产品开店教程之作图篇
Game asset reuse: a new way to find required game assets faster
JVM常见的垃圾收集器
After working in a large factory for ten years with an annual salary of 400000 yuan, I was suddenly laid off. If the company wanted to abandon you, it wouldn't leave any kindness
並發編程JUC的AQS底層源碼
闭包问题
Blind survey shows that female code farmers are better than male code farmers
爬一个网页的所有导师信息
Closure problem
Time function calculation efficiency of C
盲測調查顯示女碼農比男碼農更優秀
Redis五种基本类型
Helix QAC is updated to 2022.1 and will continue to provide high standard compliance coverage
【13. 二进制中1的个数、位运算】
Matlab tips (19) matrix analysis -- principal component analysis
[batch dos-cmd command - summary and summary] - output / display command - echo
【每日一练】产品卡片动画效果的实现
Redis transactions