Kurento实战之四:应用开发指南

2021-06-16  本文已影响0人  程序员欣宸

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概览

如何划分功能模块

按照不同的职责划分,整个代码被拆分为三部分:

  1. WebSocket相关:WebSocket相关的通用处理,例如连接建立、关闭、异常的回调,业务逻辑的分发等;
  2. WebRTC信令相关:ICE、SDP相关的处理;
  3. 业务逻辑:如果说1和2代表的是WebRTC的通用处理,那么剩下的就是如何使用Kurento来实现业务需求了,这部分的主要内容是业务应用使用Kurento官方client和KMS交互,控制KMS为端侧提供服务,交互方式如下图:


    在这里插入图片描述

WebSocket相关

最简单的逻辑应该是通用的WebSocket处理了,咱们先看这部分,复杂的稍后再说,Handler类中和WebSockert相关的逻辑如下:

  1. 继承自TextWebSocketHandler(只处理text类型的数据,对于二进制数据直接关闭会话);
  2. 重写afterConnectionEstablished:WebSocket连接建立的回调,只打了一行日志;
  3. 重写handleTransportError:WebSocket发生异常时候的回调,仅关闭WebSocketSession;
  4. 重写afterConnectionClosed:不论WebSocket是正常关闭还是发生异常,此方法都会执行,逻辑也很简单,就是调用stop方法,这个方法是用来释放KMS资源的,有好几处都会调用,我们留到稍后和其他处理KMS的地方一起讲;
  5. WebSockert部分最重要的代码是handleTextMessage方法,里面是收到前端数据时的处理逻辑:先把数据转为JsonObject对象,此对象的messageId字段有四种值,每一种id及其对应的处理方法如下表格所示:
messageId 处理方法 说明
PROCESS_SDP_OFFER handleProcessSdpOffer 收到前端SDPOffer数据后的处理逻辑
ADD_ICE_CANDIDATE handleAddIceCandidate 收到前端ICE数据后的处理逻辑
STOP handleStop HashMap删除用户数据,再远程调用MediaPipeline.release
ERROR handleError HashMap删除用户数据,再远程调用MediaPipeline.release
  1. 并不是所有的应用都需要重写上诉全部代码,还是以实际需求出发决定是否要重写,以<font color="blue">kurento-one2one-call</font>项目为例,只重写了handleTextMessage和afterConnectionClosed,其他的使用父类的即可,如下图:
在这里插入图片描述
  1. 还有一个发送消息到浏览器侧的sendMessage方法,以及发送错误信息的sendError方法;

信令相关

在这里插入图片描述

业务相关

在这里插入图片描述
    // 创建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);
  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();
      }
    }
  }

小结

以上就是整个<font color="blue">kurento-hello-world</font>的源码分析,整个工程的代码在拆分后再分析时,变得异常清晰和简单:

  1. WebSocket和常规的java开发无异,向标准靠拢即可;
  2. WebRTC相关代码占了较大比重,但是严格遵循了标准的信令流程,只要熟悉WebRTC就很容易阅读和理解;
  3. 业务逻辑其实是和业务需求相关联的,这里需要熟悉KMS提供的能力,才能充分发挥KMS的实例,而pipeline编排和各个element的使用,也会是咱们后面文章的重点,用好这些element,打磨出更强大灵活的服务;

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos

上一篇下一篇

猜你喜欢

热点阅读