3. mini-rtmp-server 使用Netty实现rtmp->httpflv服务器

179 阅读3分钟

version 0.1

引用

blog.csdn.net/qq_32139981… cloud.tencent.com/developer/a…

基本架构

image.png 本服务器基本框架如上图, 一共分为三部分RTMP server, HTTP-FLV server以及stream manager, 其中stream manager为核心。

  1. 首先, 通过stream manager来管理所有的stream对象,每个stream对象包含有stream name,拉流Client的channel,存放过往信息(主要是控制信息); stream manager则用于维护这些stream对象;
  2. RTMP server主要是用于解析处理Client请求,响应请求,创建流,处理推流等功能(此处使用OBS推流)
  3. HTTP-FLV server主要用于订阅流并将流响应到HTTP-FLV Client(此处为flv.js)

主要功能

  1. 支持RTMP推流
  2. 支持RTMP拉流
  3. 支持HTTP-FLV拉流
  4. 基于发布订阅模式进行广播
    ..................

netty简述

waylau.com/essential-n…

Eventloop 与 EventloopGroup

EventLoop 是一个具体处理 I/O 事件和定时任务的单线程执行器;通过底层操作系统提供的 I/O 模型实现多路复用,即一条线程可以监听多个 Channel,从而实现并发处理多个连接的能力。

EventLoopGroup 则是一个管理多个 EventLoop 的线程池。EventLoopGroup 可以包含多个 EventLoop,每个 EventLoop 对应一个单独的线程。EventLoopGroup 通常分为两种类型:Boss Group 和 Worker Group。Boss Group 主要负责接收客户端的 TCP 连接请求,而 Worker Group 则负责处理已接受连接的 I/O 操作和其他后续任务。

ServerBootstrap

Netty服务端的启动器,使用链式调用的方式简化服务器的配置(EventLoop、Channel、Handler)与启动

Channel

Channel 是 Netty 网络框架中的核心概念之一,它代表了一个到远程节点的连接。Channel 可以绑定多个 ChannelHandler,每个 ChannelHandler 负责处理特定的事件或逻辑。通过 ChannelPipeline,可以将多个 ChannelHandler 串联起来,形成一个处理链,从而实现灵活的事件处理和业务逻辑。

pipline

在 Netty 中,ChannelPipeline 是一个处理器链,用于处理通过 Channel 传输的事件和数据。每个事件都会经过 ChannelPipeline 中的多个 ChannelHandler 进行处理。Channel 本身只能关联一个 ChannelPipeline

生命周期

blog.csdn.net/ddd29556937…

docs.kilvn.com/essential-n…

rtmp相关功能实现

启动

image.png

通道,netty的通道采用责任链模式,一层一层的处理消息

image.png

ConnectionAdapter

public class ConnectionAdapter extends ChannelInboundHandlerAdapter {}

用于监控当前连接的生命周期

HandShakeDecoder

public class HandShakeDecoder extends ByteToMessageDecoder /*extends ChannelInboundHandlerAdapter*/ {}

此模块用于处理握手环节,握手环节主要分为两个状态(使用state()函数处理)

  1. 接收C0C1, 响应S0S1S2
  2. 接收C2,握手环节结束

ChunkDecoder

public class ChunkDecoder extends ReplayingDecoder<DecodeState> /* extends ByteToMessageDecoder extends ChannelInboundHandlerAdapter */ {}

用于解码数据,最终的结果是把msg封装成RtmpMessage对象。

cloud.tencent.com/developer/a…

blog.csdn.net/u022812849/…

RtmpMessageHanlder

public class RtmpMessageHandler extends SimpleChannelInboundHandler<RtmpMessage> /*extends ChannelInboundHandlerAdapter*/ {}

在上一层中,bit流数据会被封装成不同类型的RtmpMessageHandler对象,然后在此处理层,根据不同的RtmpMessage类型,会触发不同的handle函数来解析数据;

RtmpMessage类型

  • RtmpCommandMessage
  • RtmpVideoMessage
  • RtmpAudioMessage
  • RtmpControlMessage
  • SetChunkSize
  • SetPeerBandWidth
  • ......

ChunkEncoder

public class ChunkEncoder extends MessageToByteEncoder<RtmpMessage> /*extends ChannelOutboundHandlerAdapter*/ {}

用于将响应数据进行编码,也即为handler处理完毕的payload添加相应的Basic Header、Message Header以及Extended Timestamp

StreamManager

流管理器主要是用于管理各种直播数据流,一个直播流对象内包含一个发布者和多个订阅者;

具备接收推流,并向订阅者推送数据流的功能;其中,rtmp 订阅只需要直接转送数据,http-flv 需要将消息重新封装在tag中

Stream

主要功能分为,订阅、退订、广播,存储过往关键帧

http-flv相关功能实现

http-flv 服务器可直接使用 netty 自带的 http 协议解析模块

HttpRequestDecoder

public class HttpRequestDecoder extends HttpObjectDecoder /* extends ByteToMessageDecoder extends ChannelInboundHandlerAdapter*/ {}

使用netty自带的request

HttpResponseEncoder

public class HttpResponseEncoder extends HttpObjectEncoder<HttpResponse> /* extends MessageToMessageEncoder<Object> extends ChannelOutboundHandlerAdapter */ {}

使用netty自带的response

HttpFlvHandler

public class HttpFlvHandler extends SimpleChannelInboundHandler<HttpObject> {}

处理http-flv,将当前通道存入订阅者列表,