RED5流媒体服务器,是Java开源的实现RTMP协议的服务器。有关RTMP协议,网上有很多的介绍。现在着重介绍一下,客户端连接RED5服务器的开发流程。
RED5有一个client包red-client.jar实现了对客户端的封装,可以用来连接RED5服务器,发布数据。
RED5 client连接成功服务器后,第一步需要创建一个流:createStream,这是,服务端会创建一个streamId返回到客户端,第二步需要publish了,发布成功后,即可发布数据(流数据)。
主要的流程是:
1、FFmpeg(或者其它推流客户端)--(流推送)--->RED5服务器、接收到流后,再连接另一台RED5
2、当接收到流后,作为客户端进行(流转发)至另一台--->RED5服务器
下面,主要说下客户端到服务端的开发修改原因RED5的部分:
客户端修改red-client.jar:
BaseRTMPClientHandler类,主要添加一个方法,暴露出客户端的一个connectionconsumer,
public ConnectionConsumer getConnectionConsumerByStreamId(int streamId) {
return streamDataMap.get(streamId).connConsumer;
}
这个方法的主要目的是:拿到客户端的消费者,注册到服务端的消费者队列中。客户端的代码修改就这么多。
服务端修改,主要是修改red-server-common.jar的内容:
StreamService类的publish方法,这个方法对应的是:客户端的publish,这时候会创建一个IClientBroadcastStream类,这个类的主要作用就是可以对流进行分发:分发到web-client的连接,把流保存成flv等,在这个publish方法中,主要是为了获取到RED5服务端的connection(这个conn主要是上面的流推送时的conn,也就是红色部分),这个connection中包含的有streamId(区别自己开发的streamId)。
ClientBroadcastStream类中,添加一个方法:
/** 获取live pipe add by zjk*/
public IPipe getLivePipe() {
return this.livePipe;
}
这个方法,主要是对外提供一个获取pipe的接口,这个pipe是一个管道,可以在这个管道上注册connectionconsumer(可以把
BaseRTMPClientHandler类中的connectionconsumer注册进来,这样只要服务端来了流信息,就可以自动转发到另一台服务器)。
RTMPProtocolDecoder类的decodeStreamMetadata这个方法,主要是解析onMetaData(FLV格式的元数据信息)的,这里想要说的是,发送的数据格式是以“@setDataFrame”开始的,可以在ClientBroadcastStream中拿到metaData的信息,不过,需要封装成以“@setDataFrame”开头格式的数据,要不,RED5不能解析只以onMeta开头的数据。如果不能封装的话,可以在decodeStreamMetadata方法中添加一些逻辑或者修改它的方法参数,保存到客户端(自己开发的)里面,以streamId(这个Id可以在decodeMessage方法中拿到)作为区分。
至此,RED5的原有部分已经修改完成,剩下的设计工作,则需要根据业务设计。
FFmpeg推送流到RED5服务器的流程大致如下: