如果您在电脑或手机上看上图觉得模糊,请下载原始文件,用draw.io打开,文件所在目录是:https://github.com/zq2599/blog_demos/tree/master/files ,文件名为helloworld-flow.drawio
上图列出了信令相关的所有代码,等到看完这些,剩下的就是业务代码了,也就是图中紫色部分的handleProcessSdpOffer方法;
业务相关kurento-hello-world应用是把本地摄像头和麦克风数据传到KMS,再从KMS取得这些数据在页面展示,先看看官方是如何描述KMS pipeline的:
从上图可见pipeline逻辑非常简单:只有一个WebRtcEndpoint,把自己的Src和Sink接上就完成了,咱们来看看对应的代码,在方法handleProcessSdpOffer中:
// 创建pipeline final MediaPipeline pipeline = kurento.createMediaPipeline(); user.setMediaPipeline(pipeline); // 创建webRtcEndpoint final WebRtcEndpoint webRtcEp = new WebRtcEndpoint.Builder(pipeline).build(); user.setWebRtcEndpoint(webRtcEp); // 自己的sink连接上自己的src webRtcEp.connect(webRtcEp); // ---- Endpoint configuration String sdpOffer = jsonMessage.get("sdpOffer").getAsString(); // 注册各类监听,例如媒体资源状态变化、ICE变化等 // 通过websocket回复SDP Offer initWebRtcEndpoint(session, webRtcEp, sdpOffer); log.info("[Handler::handleStart] New WebRtcEndpoint: {}", webRtcEp.getName()); // ---- Endpoint startup // 取得ICE信息 startWebRtcEndpoint(webRtcEp);再来看看停止WebRtc的stop方法,其实就是向KMS发送了release指令:
private void stop(final WebSocketSession session) { // Remove the user session and release all resources final UserSession user = users.remove(session.getId()); if (user != null) { MediaPipeline mediaPipeline = user.getMediaPipeline(); if (mediaPipeline != null) { log.info("[Handler::stop] Release the Media Pipeline"); mediaPipeline.release(); } } } 小结以上就是整个kurento-hello-world的源码分析,整个工程的代码在拆分后再分析时,变得异常清晰和简单:
WebSocket和常规的java开发无异,向标准靠拢即可;
WebRTC相关代码占了较大比重,但是严格遵循了标准的信令流程,只要熟悉WebRTC就很容易阅读和理解;
业务逻辑其实是和业务需求相关联的,这里需要熟悉KMS提供的能力,才能充分发挥KMS的实例,而pipeline编排和各个element的使用,也会是咱们后面文章的重点,用好这些element,打磨出更强大灵活的服务;
你不孤单,欣宸原创一路相伴Java系列
Spring系列
Docker系列
kubernetes系列
数据库+中间件系列
DevOps系列
欢迎关注公众号:程序员欣宸微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos