(转)基于live555的流媒体代理转发服务器

对于并发量并不大而且对性能要求不是很高的流媒体传输模块,live555还是很好的选择,下面说一下我所实现的流媒体代理服务器(目前只能实现对H264单视频的转发)代理转发主要

对于并发量并不大而且对性能要求不是很高的流媒体传输模块,live555还是很好的选择,下面说一下我所实现的流媒体代理服务器(目前只能实现对H264单视频的转发)

代理转发主要分为对RTSP的转发与对RTP的转发(没有实现对rtcp的转发),尽量做到不破坏原有程序框架,所以还是要将整个代理过程融合于ServerMediaSubsession、Source、Sink的循环中,按照流程,RTSP OPTIONS不是必需进行转发,直接转到DESCRIBE的转发过程。

DECRIBE转发:在看过很多大型的流媒体服务器协议以后,会发现有一个相同点:前端设备在注册到流媒体服务器以后会将其自身的无论是实时资源还是录像资源都上报到流媒体服务器中集中管理,那么此处同理,在流媒体服务器上线(主动注册与保活)后改为主动向前端请求资源,到此处也就是发送DESCRIBE请求,我实现的代理服务器中,专门定义了一个类,继承自RTSPClient,向前端设备发送DESCRIBE请求,成功接收到携带SDP信息的反馈以后,根据SDP信息生成MediaSession,再执行其中每一个MediaSubsession的initiate(),这样获取由前端发送来数据的Source就已经准备就绪,同时,在每一个MediaSubsession建立以后,在对应流的ServerMediaSession中加入ServerMediaSubsession(此处ServerMediaSubsession继承自OnDemandServerMediaSubsession),这样就做到了一个ServerMediaSubsession对应一个MediaSubsession(这里一定要区分ServerMediaSubsession与MediaSubsession),两路会话的连接,下面就是客户端发起了DESCRIBE请求,转到RTSPServer::RTSPClientSession::handleCmd_DESCRIBE(),再转到ServerMediaSession::generateSDPDescription(),因为是转发,而且不能让客户端知道是转发,所以sdp信息在m字段前面的参数都是基于代理服务器本身,从m开始便是真正的媒体信息,原有的live555结构中,获取每一个track的sdpLine是由virtual char const* OnDemandServerMediaSubsession::sdpLines();得到,于是,我们可以重写此virtual函数,返回什么呢,返回的就是我们刚才传入的MediaSubsession的savedSDPLines()返回值。这样,SDP信息就可以在不破坏原有live555循环的基础上构造出来,并实现转发了。

SETUP转发:同DESCRIBE一样,原有框架已经形成,在收到SETUP请求以后,找RTSPServer::RTSPClientSession::handleCmd_SETUP(),再找到virtual void OnDemandServerMediaSubsession::getStreamParameters(),在原有live555循环中,此函数作用为建立本地接收端口,建立createNewSource与createNewSink,将数据传输循环中的各个部件都准备妥当,一旦收到Play命令就开始循环工作,那么同样重写此virtual函数,在重写中实现向前端发送SETUP请求,等待响应成功,再执行本地的SETUP,向前端发送SETUP实现可以同样由刚才传入的"RTSPClient继承"与MediaSubsession来实现发送命令,等待返回,再继续执行OnDemandServerMediaSubsession::getStreamParameters()实现本地的SETUP,如此一来,本地与远程的SETUP都已完成。

PLAY转发:同样,按照流程,重写OnDemandServerMediaSubsession::startStream()函数,发送Play请求到远程,等待返回,再执行本地的startStream(),本地与远程的Play都已完成。

上面已经将RTSP的转发实现,而且基本是在live555原有基础上进行,没有破坏原有框架结构,下面进行rtp的转发。

rtp的转发实现的重点是在建立source到sink的循环,重写OnDemandServerMediaSubsession::createNewStreamSource,与OnDemandServerMediaSubsession::createNewRTPSink,理想中的转发是能够实现收到rtp包不进行任何重组,直接发送即可,但我所实现的只能是由MediaSubsession中的readSource获取完整的一帧后,再交给rtpSink进行重新切片组装,具体到实现上,我实现了一个集成自H264VideoStreamFramer的类,并将MediaSubsession->readSource作为inputSource传入,重写doGetNextFrame(),从inputSource中获取完整一帧,copy到fTo,再交由createNewRTPSink()返回的H264VideoRTPSink进行重新组装并发送,后来考虑到此种做法,有利有弊,与不重新组装,直接发送,各有考虑。

如此,便实现了RTSP与RTP的转发功能,多有不妥,后续会持续改进,还望能够在留言中多多指正!

2012.3.23

有朋友问到rtcp的转发问题,这里阐述下我的理解:

转发RTCP实际的意义并不是很大,一个方面是rtcp控制的可能是两条不通的数据链路,对拥堵的控制总是在较小的链路基础上,牺牲太大;第二是作为服务器考虑,服务器通过双重身份将数据取来再发出去,控制协调应当完全自主掌控,如果后期在服务器中加入缓存机制实现抖动控制和拥堵控制,可以通过对进线与出线的rtcp控制达到控制作用,而且效果较好!

转自:http://www.easydarwin.org/article/Streaming/1.html

时间: 2024-10-06 03:57:50

(转)基于live555的流媒体代理转发服务器的相关文章

基于live555的流媒体代理转发服务器

参考: 1,基于live555的流媒体代理转发服务器 http://blog.csdn.net/xiejiashu/article/details/7380897 2,linux 下基于jrtplib库的实时传送实现 http://general.blog.51cto.com/927298/328224

Nginx实现ssl一级、二级域名证书部署并用https访问代理转发服务器

1.  规划 域名 解析IP Nginx代理 htpps://www.devcult.com 47.88.10.155   htpps://auto.devcult.com 47.88.10.155 https://www.automa.com htpps://www.automa.com 103.200.200.203   本次实验用了2个一级域名,1个二级域名,2个ip地址:实现功能如上图所示,要求全部使用https,并且一级域名实现自动补全www. 2. 前提准备 47.88.10.155

基于live555的一个简单RTSP服务器

1,编译live555源码目录下的 BasicUsageEnvironment.groupsock.liveMedia.UsageEnvironment四个工程生成相应的库文件: 目录结构如下: 2,包含上面四个工程目录下的include目录文件和生成的库文件,编译mediaServer目录下的文件,会生成相应的exe文件(在windows下编译生exe,在linux下可以生成相应的运行程序) 在windows平台上会生成mediaServer.exe文件,运行该exe文件如下图: 3,把提示中

基于go手动写个转发代理服务

由于公司经常需要异地办公,在调试的时候需要用到内网环境,因此手动写了个代理转发服务器給兄弟们用:socks5proxy. 选型上,语言上就选择了Go,简单清晰,转发协议选择了socks5. SOCKS5协议介绍 SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递,SOCKS是"SOCKetS"的缩写. SOCKS5是SOCKS4的升级版,其主要多了鉴定.IPv6.UDP支持. SOCKS5协议可以分为三个部分: (1) 协议版本及认证方式 (2) 根据认证方式执

基于haproxy-1.5.12版本的http层负载均衡代理转发,附带测试效果

--前期环境部署: haproxy  192.168.64.129 nginx   192.168.64.129 client  192.168.64.128 (1.在server端口添加4个虚拟机 [haproxy和nginx共用一台服务器,不同端口] [[email protected] ~]# tree -n /usr/local/nginx/conf/conf.d/ /usr/local/nginx/conf/conf.d/ ├── bbs.example.com.8000.conf ├

基于 Red5 的流媒体服务器的搭建和应用

http://www.ibm.com/developerworks/cn/opensource/os-cn-Red5/ Red5 是一个采用 Java 开发的开源免费 Flash 流媒体服务器.Red5 基于 Java 和一些功能强大的开源框架,为企业级应用奠定了标准.它使用 RTMP,RTMPT,RTMPS 和 RTMPE 流媒体协议, 支持:将音频(MP3)和视频(FLV,MP4,F4V,3GP)转换成播放流:录制客户端播放流:共享对象:现场直播流发布:远程调用.Red5 为即时通信,远程教

基于域名的7层转发的实现(NAT+反向代理)

在公司的实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分,这在实际使用过程中非常的痛苦(记忆困难.一一对应关系也没有规律.访问的时候还得加端口),这个痛苦的问题用表格的形式来形象的描述如下: Public IP Public Port Number Internal IP Internal Port Number Note 1.1.1.1 80 192.168.1.10 80 service A 1.1.1.

squid 代理缓存服务器

Squid cache(简称为Squid)是一个流行的自由软件,它符合GNU通用公共许可证.Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据并进行缓存,也可以用在局域网中,使局域网用户通过代理上网.Squid主要设计用于在Linux一类系统运行 代理服务器原理 代理服务器接受到请求后,首先与访问控制列表中的访问规则相对照,如果满足规则,则在缓存中查找是否存在需要的信息. 对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Interne

nginx反向代理-后端服务器组设置

nginx服务器的反向代理时其最常用的重要功能之一,在实际工作中应用广泛,涉及的配置指令也比较多.下面会尽量详细地介绍对应的指令,及其使用状态. 反向代理一般是互联网需要向内网拉取资源,比如访问一个web网站时,互联网应用通过一个代理服务器到后面真实的web服务器拉取应用所需的数据. nginx服务器反向代理用到的指令如果没有特别的说明,原则上可以出现在nginx配置文件的http块,server块和location块中,但是同正向代理一样,一般是搭建在nginx服务器中单独配置一个server