version 0.1
引用
blog.csdn.net/qq_32139981… cloud.tencent.com/developer/a…
基本架构
本服务器基本框架如上图, 一共分为三部分RTMP server, HTTP-FLV server以及stream manager, 其中stream manager为核心。
- 首先, 通过stream manager来管理所有的stream对象,每个stream对象包含有stream name,拉流Client的channel,存放过往信息(主要是控制信息); stream manager则用于维护这些stream对象;
- RTMP server主要是用于解析处理Client请求,响应请求,创建流,处理推流等功能(此处使用OBS推流)
- HTTP-FLV server主要用于订阅流并将流响应到HTTP-FLV Client(此处为flv.js)
主要功能
- 支持RTMP推流
- 支持RTMP拉流
- 支持HTTP-FLV拉流
- 基于发布订阅模式进行广播
..................
netty简述
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
生命周期
rtmp相关功能实现
启动
通道,netty的通道采用责任链模式,一层一层的处理消息
ConnectionAdapter
public class ConnectionAdapter extends ChannelInboundHandlerAdapter {}
用于监控当前连接的生命周期
HandShakeDecoder
public class HandShakeDecoder extends ByteToMessageDecoder /*extends ChannelInboundHandlerAdapter*/ {}
此模块用于处理握手环节,握手环节主要分为两个状态(使用state()函数处理)
- 接收C0C1, 响应S0S1S2
- 接收C2,握手环节结束
ChunkDecoder
public class ChunkDecoder extends ReplayingDecoder<DecodeState> /* extends ByteToMessageDecoder extends ChannelInboundHandlerAdapter */ {}
用于解码数据,最终的结果是把msg封装成RtmpMessage对象。
cloud.tencent.com/developer/a…
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,将当前通道存入订阅者列表,