RED5流媒体服务器作为客户端转发流至另一个RED5服务器

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服务器的流程大致如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值