开源流媒体SRS

一、SRS简介

1、SRS简介

       SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。SRS提供了丰富的接入方案将RTMP流接入SRS, 包括推送RTMP到SRS、推送RTSP/UDP/FLV到SRS、拉取流到SRS。 SRS还支持将接入的RTMP流进行各种变换,譬如将RTMP流转码、流截图、 转发给其他服务器、转封装成HTTP-FLV流、转封装成HLS、 转封装成HDS、转封装成DASH、录制成FLV/MP4。SRS包含支大规模集群如CDN业务的关键特性, 譬如RTMP多级集群、源站集群、VHOST虚拟服务器 、 无中断服务Reload、HTTP-FLV集群。此外,SRS还提供丰富的应用接口, 包括HTTP回调、安全策略Security、HTTP API接口、 RTMP测速。SRS在源站和CDN集群中都得到了广泛的应用Applications。

2、dolphin mode

SRS-Dolphin是SRS中多进程解决方案。是一个基于ST的tcp代理,不推荐使用。推荐使用如下:

GO-Oryx:支持SRS的多进程;

SO_REUSEPORT:在同一个端口启动多个SRS监听

注:协程库ST(state-threads)

http://state-threads.sourceforge.net/docs/st.html

https://github.com/ossrs/state-threads

3、上下文切换

  • 线程切换,同一进程中的两个线程之间的切换
  • 进程切换,两个进程之间的切换
  • 模式切换,在给定线程中,用户模式和内核模式的切换
  • 地址空间切换,将虚拟内存切换到物理内存

       CPU切换前把当前任务的状态保存下来,以便下次切换回这个任务时可以再次加载这个任务的状态,然后加载下一任务的状态并执行。任务的状态保存及再加载, 这段过程就叫做上下文切换。

4、srs启动流程

(1)首先检查解析启动命令参数,初始日志接口,检查配置文件是否正确

(2)创建SrsServer服务,初始化一些变量

(3)检查是否后台运行还是控制台运行

(4)初始化st 协程库,信息号管理器

(5)如果后台运行写进程pid到文件

(6)监听连接:

  • listen_rtmp: rtmp推流或拉流连接
  • listen_http_api: api请求连接
  • listen_http_stream: http拉流连接,http-flv ,http-ts,http-aac,http-mp3
  • listen_stream_caster: 接收MpegTSOverUdp流请求,rtsp推流请求,http-flv推流请求

(7)初始化http_api接口处理

(8) 启动ingest协程,使用ffmpeg, 拉取文件或流转发到本服务

(9)启动主线程

 

二、SRS推拉流

       srs启动之后,客户端推拉流时,需要调用下面这些主要类来相互协作完成推拉流功能, 该流程描述媒体在srs主要类之间的静态流程。

1、总体流程

(1)客户端发送rtmp连接请求,SrsListener收到connect请求后,创建一个SrsConnection,每个SrsConnection会启动一个线程来完成相应任务

(2) SrsRtmpConn首先按rtmp协议流程交互成功之后,根据请求url创建流名流类型等标启,同时调用fetch_or_create生成一个处理音视频源的SrsSource,,

2、推流

       创建SrsPublishRecvThread线程,接收客户端发送过来rtmp数据包,数据包由SrsRtmpServer来处理,如果是音视频数据,由process_publish_message来处理,它会通过SrsSource对媒体流的进行处理

(1)如果该服务是边缘服务,SrsSource直接将媒体proxy publish到源站服务。

(2)否则SrsSource会将publish流放入到每个SrsConsumer的媒体数据对列中,一个SrsConsumber就是一个播放客户端。同时调用SrsOriginHub将媒体流根据配置来生成flv,hls,mp4录像文件,以及是否将发布流转发到其他rtmp服务器等;最后检查如果启用GopCache会将媒体流写入GopCache对列中.用于当一个新的播放请求来时,保证首先能获取一个gop数据,以防播放开始时不黑屏或花屏。

3、拉流

(1)如果是源站拉流同时启用源站集群,如果流不是该源站发布,则根据配置的发送api请求到其他源站,检查是否在其他源站发布了流,如果是,则发送一个redirect,要求拉流客户端重定向指定服务器拉流。注意rtmp重定向信令,如果客户端直接请求的源站,要求rtmp客户端支持redirect,如果srs边缘回源到源站后再重定向,那是没有问题的,因为srs边缘支持redirect。

(2)如果不走第1步,则创建一个SrsConsumer与SrsQueueRecvThread线程, 创建SrsConsumer时,如果启用gopcache,首先会将gopcache媒体数据插入SrsConsumer的数据队列中。如果是边缘拉流,则使用SrsPlayEdge回源拉流。将回源拉的媒体流数据插入SrsConsumer的数据队列中。

(3)SrsQueueRecvThread线程负责将SrsConsumer的数据队列中的媒体数据发送给客户端。SrsConsumer队列中数据来源于GopCache,源站publish的数据,以及回源拉流的数据。

 

三、rtmp相关

1、rtmp监听与连接流程

(1)SerServer调用listern启动rtmp监听线程

(2)客户端发送连接请求,监听线程收到请求后,发送on_tcp_accetpt()事件

(3)SrsrServer处理accetp_client() 创建一个新的SrsRtmpConn,同时启动SrsRtmpConnThread连接线程

(4) SrsRtmpConnThread收到客户端rtmp握手,同时根据rtmp连接流程创建一个rtmp连接

(5)连接成功之后,调用stream_service_cycle对rtmp媒体流处理

2、rtmp媒体流处理过程

(1)identify_client 根据客户端请求类型创建流名,流Id,流类型(推拉流)等客户端标识信息

(2)check_vhost 根据配置检查域名是否合法

(3)http_hooks_on_connect 发送on_connect事件

(4)check检测根据配置检查是否允许推拉流

(5)根据请求创建或获取SrsSource对象

(6)根据流类型调用对应的推或拉流流程

3、rtmp推流流程

(1)接收客户端发布流交互消息,start_fmle_publish完成发布流交互。

(2)发送on_pulibsh事件。

(3)SrsSource::can_publish 检查SrsSource流的是否已发布,如果是返回,不再发布。

(4)检查是否边缘推流,如果是启动SrsEdgeForwarder线程,将流推向源站。

(5)SrsSource::on_publish,如果配置flv,hls,mp4等,则开始录相,如配置转发,则启动转发线程。

(6)启动SrsPublishRecvThread,线程,接收客户端数据,调用SrsRtmpConn::handle_publish_message处理数据。

(7)SrsRtmpConn:::process_publish_message处理推流数据。

(8)如果是边缘推流,将数据SrsEdgeForwarder队列,将数据发送到源站。

(9)如是不是边缘推流,调用SrsSource相关方法处理音视频数据. 对hls,mp4,flv录像,转发,gopCache,以其放到SrsConsumber的消息对列中,每个SrsConsumber是一个播放客户端。

(10)如果停止推流, SrsPublishRecvThread将stop退出线程,。

(11)调用on_edge_proxy_unpublish停止边缘推流线程。

(12)SrsSource::on_unpublish,停止hls.,mp4,flv, 转发,清空gopCache。

(13)http_hook_on_unpublish发送on_unpublish事件。

4、rtmp拉流流程

(1)SrsRtmpServer::start_play 根据rtmp协议完成play流程。

(2)SrsRtmpConn::http_hook_on_play 发送on_play事件。

(3)playing检查是否开启源站集群,如果是,且流没有在该源站发布,向其他源站发送请求,检查流在哪个源站发布,如果找到,重定向到该源站。

(4)如是不是源站集群,create_consumer创建consumer,同时将gop缓冲数据放入consumer消息队列中,如果是边缘拉流,启动SrsEdgeIngester回源拉流。

(5)recv_messae接收客户端信息,放下consumer消息队列中,pump从队列获取消息,process_play_control_msg处理rtmp控制消息。

(6)dump_packets从consumer的消息队列中获取媒体数据, send_and_free_message 发送给给客户端。

(7)stop停止播, http_hook_on_stop发送on_stop事件。

 

SRS(Simple Rtmp Server)的定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。 • 运营级: 商业运营追求极高的稳定性,良好的系统对接,以及错误排查和处理机制。譬如日志文件格式,reload,系统HTTP接口,提供init.d脚本,转发,转码,边缘回多源站,都是根据CDN运营经验作为判断这些功能作为核心的依据。 • 互联网: 互联网最大的特征是变化,唯一不变的就是不断变化的客户要求,唯一不变的是基础结构的概念完整性和简洁性。互联网还意味着参与性,听取用户的需求和变更,持续改进和维护。 • 直播服务器: 直播和点播这两种截然不同的业务类型,导致架构和目标完全不一致,从运营的设备组,应对的挑战都完全不同。两种都支持只能说明没有重心,或者低估了代价。 • 集群: FMS(AMS)的集群还是很不错的,虽然在运营容错很差。SRS(Simple Rtmp Server)支持完善的直播集群,Vhost分为源站和边缘,容错支持多源站切换、测速、可追溯日志等。 • 概念完整性: 虽然代码甚至结构都在变化,但是结构的概念完整性是一直追求的目标。从SRS(Simple Rtmp Server)服务器,P2P,ARM监控产业,MIPS路由器,服务器监控管理,ARM智能手机,SRS(Simple Rtmp Server)的规模不再是一个服务器而已。 • 简单实现: 对于过于复杂的实现,宁可不加入这个功能,也不牺牲前面提到的要求。对于已经实现的功能的代码,总会在一个版本release前给予充分的时间来找出最简答案。不求最高性能,最优雅,最牛逼,但求最简单易懂。
### 回答1: SRS流媒体是一种流媒体服务器软件,可在Windows操作系统上运行。SRS代表Simple Realtime Server,它是一个开源流媒体服务器,提供了高效的音视频传输和流媒体处理能力。 SRS流媒体服务器主要用于直播和点播服务。它支持常见的流媒体协议和格式,如RTMP、HLS、FLV和MP4。通过SRS,用户可以将音视频内容从源站点传输到客户端设备,使用户能够实时观看和听取流媒体内容。 在Windows系统上,SRS提供了简单易用的安装和配置过程。用户只需下载适用于Windows的SRS软件,并按照提供的指南进行安装。一旦安装完成,用户可以通过命令行或配置文件对SRS进行进一步的配置,以满足其特定的需求。 SRS流媒体服务器在Windows上具有良好的稳定性和可靠性,能够处理大量的并发连接和高负载。它提供了多种功能和特性,如性能监控、转码、水印、鉴权、录制等。用户可以根据自己的需求选择合适的配置和功能,以创建一个定制化的流媒体服务平台。 总之,SRS流媒体服务器在Windows操作系统上是一种可靠的选择,它提供了强大的音视频传输和流媒体处理能力,适用于各种直播和点播服务需求。无论是个人用户还是企业用户,都可以通过SRS轻松搭建自己的流媒体系统。 ### 回答2: SRS流媒体是一个开源流媒体服务器软件,可以在Windows操作系统上运行。它提供了丰富的功能,包括实时的音视频流传输、跨平台支持和高性能的编解码能力。 SRS流媒体可以用于搭建自己的流媒体服务平台,支持多种流媒体协议,如RTMP、HLS和HTTP-FLV等。不仅如此,它还支持动态转发、边缘节点传输和优质的流媒体传输控制,可以满足不同场景下的流媒体需求。 在Windows操作系统上安装和配置SRS流媒体相对简单。只需下载对应版本的SRS软件包,并按照官方文档提供的步骤进行安装和配置即可。SRS流媒体具有良好的兼容性,可以在不同版本的Windows系统上运行,并能与其他常用的流媒体软件和设备进行配合使用。 通过SRS流媒体,用户可以方便地实现音视频数据的分发和传输。无论是在线直播、点播还是视频会议等应用场景,SRS流媒体都能够提供稳定、高质量的流媒体传输服务。同时,SRS流媒体还支持自定义开发和定制功能,用户可以根据自己的需求进行二次开发和扩展。 总结起来,SRS流媒体适用于Windows操作系统,提供了强大的功能和稳定的流媒体传输服务,可以满足各种不同的流媒体应用需求。无论是个人、企业还是机构,都可以使用SRS流媒体搭建自己的流媒体平台,实现高质量的音视频传输和流媒体服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值