流媒体服务器实现

使用Nginx搭建流媒体服务器 流媒体服务器(Streaming Media Server)是一种用于存储和传输音频、视频、直播等媒体内容的服务器软件。它通过网络将媒体文件实时传输给用户,而不需要用户先下载完整文件。流媒体服务器支持按需播放、实时广播等功能,常见的使用场景包括在线视频、音频点播、直播视频等。视频流媒体数据传输往往对流媒体服务器编解码能力和协议转换有要求,因为不同的编码格式和不同的协议适用的场景不同。例如,RTMP协议延迟低,但是web浏览器不支持,需要将其转为HLS或者是FLV才能进行播放。 阅读详情

1 引言

  随着互联网的飞速发展,流媒体技术的应用越来越广泛,从网上广播、电影播放到远程教学以及在线的新闻网站等都用到了流媒体技术。但现有公开文献所报道 的大多是利用现有的流媒体服务器来搭建一个流媒体服务系统,或者是针对流媒体数据的编码方式所进行的研究。本文对流媒体服务器技术的研究重点在于如何建立 一个服务器,并且在实现流媒体传输的两个基本协议RTP/RTCP的基础上构建一个基本的流媒体服务器。

2 流媒体技术简介

  2.1 “流”的定义

  现在网上传输视频、音频主要有下载(Download)和流式传输(Streaming)两种方式。流式传输是连续传送视/音频信号,当流媒 体在客户机播放时其余部分在后台继续下载。流式传输有顺序流式传输(Progressive Streaming)和实时流式传输(Realtime Streaming)两种方式。实时流式传输是实时传送,特别适合现场事件,实时流式传输必须匹配连接带宽,这意味着图像质量会因网络速度降低而变差,以 减少对传输带宽的需求。“实时”的概念是指在一个应用中数据的交付必须与数据的产生保持精确的时间关系。

  在Internet中使用流式传输技术的连续时基媒体就称为流媒体,通常也将其视频与音频称为视频流和音频流。实现流式传输一般都需要专用服务器和播放器。

  2.2 流媒体系统组件

  流媒体是由各种不同软件构成的,这些软件在各个不同层面上互相通信,基本的流媒体系统包含以下3个组件:

  播放器(Player),用来播放流媒体的软件。

  服务器(Server),用来向用户发送流媒体的软件。

  编码器(Encode),用来将原始的音频视频转化为流媒体格式的软件。

  这些组件之间通过特定的协议互相通信,按照特定的格式互相交换文件数据。有些文件中包含了由特定编解码器解码的数据,这种编解码器通过特定算法压缩文件的数据量。

3 流媒体服务器的基本功能和服务方式

  3.1 流媒体服务器的主要功能

  (1)响应客户的请求,把媒体数据传送给客户。流媒体服务器在流媒体传送期间必须与客户的播放器保持双向通信(这种通信是必需的,因为客户可能随时暂停或快放一个文件)。

  (2)响应广播的同时能够及时处理新接收的实时广播数据,并将其编码。

  (3)可提供其他额外功能,如:数字权限管理(DRM),插播广告,分割或镜像其他服务器的流,还有组播。

  3.2 流媒体服务器的服务方式

  (1)单播。在客户端与媒体服务器之间建立一个单独的数据通道,从1台服务器送出的每个数据包只能传送给1个客户机。

  (2)组播。在以组播技术构建的网络上,允许路由器一次将数据包复制到多个通道上。

  (3)点播与广播。点播连接是客户端与服务器之间的主动的连接,在点播连接中,用户通过选择内容项目来初始化客户端连接,用户可以开始、停 止、后退、快进或暂停流。广播指的是用户被动地接收流,在广播过程中,数据包的单独一个拷贝将发送给网络上的所有用户,客户端接收流,但不能控制流。

4 构建流媒体服务器

  4.1 RTP/RTCP协议简介

  实时传输协议RTP(Realtime Transport Protocol):是针对Internet上多媒体数据流的一个传输协议, 由IETF(Internet工程任务组)作为RFC1889发布。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同 步。RTP的典型应用建立在UDP上,但也可以在TCP或ATM等其他协议之上工作。RTP本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠 的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。

  实时传输控制协议RTCP(Realtime Transport Control Protocol):负责管理传输质量在当前应用进程之间交换控制信息。在RTP会话期间,各参与者周期性地传送RTCP包,包中含有已发送的数据包的数 量、丢失的数据包的数量等统计资料,因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,能以有效的反馈 和最小的开销使传输效率最佳化,故特别适合传送网上的实时数据。

  RTCP主要有4个功能:

  (1)用反馈信息的方法来提供分配数据的传送质量,这种反馈可以用来进行流量的拥塞控制,也可以用来监视网络和用来诊断网络中的问题;

  (2)为RTP源提供一个永久性的CNAME(规范性名字)的传送层标志,因为在发现冲突或者程序更新重启时SSRC(同步源标识)会变,需要一个运作痕迹,在一组相关的会话中接收方也要用CNAME来从一个指定的与会者得到相联系的数据流(如音频和视频);

  (3)根据与会者的数量来调整RTCP包的发送率;

  (4)传送会话控制信息,如可在用户接口显示与会者的标识,这是可选功能。

  4.2 RTP/RTCP工作过程

  工作时,RTP协议从上层接收流媒体信息码流(如H.263),装配成RTP数据包发送给下层,下层协议提供RTP和RTCP的分流。如在 UDP中, RTP使用一个偶数号端口,则相应的RTCP使用其后的奇数号端口。RTP数据包没有长度限制,它的最大包长只受下层协议的限制。

  4.3 服务器的算法

  服务器软件模型主要有两种,即并发服务器和循环服务器。循环服务器(Iterative Server)是指在一个时刻只处理一个请求的服务器。并发服务器(Concurrent Server)是指在一个时刻可以处理多个请求的服务器。事实上,多数服务器没有用于同时处理多个请求的冗余设备,而是提供一种表面上的并发性,方法是依 靠执行多个线程,每个线程处理一个请求,从客户的角度看,服务器就像在并发地与多个客户通信。

  由于流媒体服务时间的不定性和数据交互实时性的请求,流媒体服务器一般采用并发服务器算法。本文构建了一个基本的流媒体服务器,能够同时响应 多个用户的请求,把本地硬盘流媒体文件或实时数据流(H.263格式)发送给用户。在应用中,把客户分为请求实时数据的实时客户和请求文件数据的文件客户 两类。主要算法为:

  (1)打开设备,分配资源。当设备准备好时,创建一个RTP实时服务线程和一个RTCP实时服务线程。

  (2)创建一个UDP套接字并将其绑定到所提供服务的地址之上。

  (3)反复调用接收模块,接收来自客户的RTCP报告,根据其类型做出响应。对新实时客户的请求,把客户地址添加到实时服务的客户列表中,对 新文件客户的请求,则创建一个新RTP文件服务线程和一个新RTCP文件服务线程;对已经在服务中的客户则根据RTCP报告的内容调整服务。

  RTP实时服务线程1:初始化客户列表和RTP首部。

  RTP实时服务线程2:从设备读取媒体数据,把数据发送给实时服务列表中的客户。

  RTP实时服务线程3:更新RTP首部和统计数据。

  RTP实时服务线程4:计算延时,重复第二步。

  RTCP实时服务线程1:初始化RTCP首部。

  RTCP实时服务线程2:发送发送方报告给实时服务列表中的客户。

  RTCP实时服务线程3:计算延时,重复第二步。

  RTP文件服务线程1:初始化RTP首部。

  RTP文件服务线程2.:从文件读取媒体数据,把数据发送给客户。

  RTP文件服务线程3:更新已发送数据的统计信息,为生成发送方报告做准备。

  RTP文件服务线程4:计算延时,调整发送速度,正常情况下开始重复第二步。

  RTCP文件服务线程1:初始化RTCP首部,发送一个源描述(SDES)报文给客户。

  RTCP文件服务线程2:根据已发送数据的统计信息生成发送方报告,发送给客户。

  RTCP文件服务线程3:计算延时,正常情况下开始重复第一步。

5 流媒体服务器实现中应注意的问题

  5.1 会话和流的两级分用

  一个RTP会话(Session)包括传给某个指定目的地对(Destination Pair)的所有通信量,发送方可能包括多个。而从同一个同步源发出的RTP分组序列称为流(Stream),一个RTP会话可能包含多个RTP流。一个 RTP分组在服务器端发送出去的时候总是要指定属于哪个会话和流,在接收时也需要进行两级分用,即会话分用和流分用。只有当RTP使用同步源标识 (SSRC)和分组类型(PTYPE)把同一个流中的分组组合起来,才能够使用序列号(Sequence Number)和时间戳(Timestamp)对分组进行排序和正确回放。

  5.2 多线程的管理

  并发服务器模式要求用多线程来提供服务,所以多线程的管理十分重要。在本文构建的服务器中,不同客户的请求和反馈都由服务器的主线程处理,由 于实时数据的独有性,不同实时客户可以共用一个RTP实时服务线程和一个RTCP实时服务线程,这样可以大大减小服务器的负担,而每个文件客户由于请求的 文件不同,相应地对速度和开始时间的要求都可能不同,所以需要有自己独有的RTP文件服务线程和RTCP文件服务线程。

  RTP服务线程负责把实时数据流发送给客户, RTCP服务线程根据RTP线程的统计数据,产生发送方报告给客户。RTP线程和RTCP线程之间通过一段共享内存交互统计数据,对共享内存必须设置互斥 体进行保护,防止出现错误读写。在这种方式下,服务器可以根据每个用户的不同请求和具体情况方便地提供不同的服务。

  5.3 时间戳的处理

  时间戳字段是RTP首部中说明数据包时间的同步信息,是数据能以正确的时间顺序恢复的关键。时间戳的值给出了分组中数据的第一个字节的采样时 间 (Sampling Instant),要求发送方时间戳的时钟是连续、单调增长的,即使在没有数据输入或发送数据时也是如此。在静默时,发送方不必发送数据,保持时间戳的增 长,在接收端,由于接收到的数据分组的序号没有丢失,就知道没有发生数据丢失,而且只要比较前后分组的时间戳的差异,就可以确定输出的时间间隔。

  RTP规定一次会话的初始时间戳必须随机选择,但协议没有规定时间戳的单位,也没有规定该值的精确解释,而是由负载类型来确定时钟的颗粒,这样各种应用类型可以根据需要选择合适的输出计时精度。

  在RTP传输音频数据时,一般选定逻辑时间戳速率与采样速率相同,但是在传输视频数据时,必须使时间戳速率大于每帧的一个滴答。如果数据是在同一时刻采样的,协议标准还允许多个分组具有相同的时间戳值。

  5.4 媒体数据发送速度的控制

  由于RTP协议没有规定RTP分组的长度和发送数据的速度,因而需要根据具体情况调整服务器端发送媒体数据的速度。对来自设备的实时数据可以 采取等时间间隔访问设备缓冲区,在有新数据输入时发送数据的方式,时间戳的设置相对容易。对已经录制好的本地硬盘上的媒体文件,以H.263格式的文件为 例,由于文件本身不包含帧率信息,所以需要知道录制时的帧率或者设置一个初始值,在发送数据的时候找出发送数据中的帧数目,根据帧率和预置值来计算时延, 以适当的速度发送数据并设置时间戳信息。

  5.5 多种流同步

  RTCP的一个关键作用就是能让接收方同步多个RTP流,例如:当音频与视频一起传输的时候,由于编码的不同,RTP使用两个流分别进行传 输,这样两个流的时间戳以不同的速率运行,接收方必须同步两个流,以保证声音与影像的一致。为能进行流同步,RTCP要求发送方给每个传送一个唯一的标识 数据源的规范名(Canonical Name),尽管由一个数据源发出的不同的流具有不同的同步源标识(SSRC),但具有相同的规范名,这样接收方就知道哪些流是有关联的。而发送方报告报 文所包含的信息可被接收方用于协调两个流中的时间戳值。发送方报告中含有一个以网络时间协议NTP(Network Time Protocol)格式表示的绝对时间值,接着RTCP报告中给出一个RTP时间戳值,产生该值的时钟就是产生RTP分组中的TimeStamp字段的那 个时钟。由于发送方发出的所有流和发送方报告都使用同一个绝对时钟,接收方就可以比较来自同一数据源的两个流的绝对时间,从而确定如何将一个流中的时间戳 值映射为另一个流中的时间戳值。

6 结论

  流媒体技术的应用日益广泛,对流媒体技术的研究具有很大的实际意义,本文通过对RTP/RTCP协议的研究,分析流媒体服务器的一般功能和结 构,给出构建一个基本的流媒体服务器的实现方案,实验证明可以同时满足多个实时和文件客户的要求,并已经应用于一个远程监控系统中。
流媒体服务器概览 本文介绍了Top 10的开源流媒体服务器及选型建议。 阅读详情

相关推荐

流媒体之从零实现搭建简单流媒体服务器,推流,拉流播放全景视频

一、直播与点播 直播:在我的理解中是实时录制的内容,类似各个晚会的实时直播过程,在现场采集图像的同时传输影像到网络上。 点播:是提前录制完成的内容,类似某些直播平台上根据观众的需求播放某些电影或经典电视剧。终端看到的内容是编辑好的视频文件,不是实时录制的。 本篇文章实现的功能就类似是点播,将本地的全景视频通过服务器传输到各个客户端。 二、实现直播或点播的关键步骤 1、搭建及配置流媒体服务器 ; 2、推流,将本地视频或直播视频以流媒体的形式推送给流媒体服务器 (可能会涉及格式转换); 3、拉流 ,从服务

Studing的博客 1万+

《从零开始编写一个直播服务器》 C++ 实现一个最简单的RTSP流媒体服务器

在安防行业中,onvif协议与gb协议是两种标准,gb是国内安防行业的标准,onvif是国外的安防行业的标准,其中gb28181中视频流是ps流、由设备、下级平台推送到上级平台,具有上公有云的特点,而onvif视频流采用的是rtsp,通常用于内网访问,当需要rtsp流可以上公有云的话,可以使用r-rtsp,r-rtsp交互流程正好与rtsp流程相反,由服务端主动发起请求。通过本文的学习,你应该对rtsp视频流有了一定的认识,希望对你后面的学习有所帮助。

weixin_44834554的博客 2940

go srs 流媒体服务器_Go语言实现流媒体服务器开发框架

Monibuca​monibuca.com背景市面上的流媒体服务器不可谓不多,从本人的第一份工作起,就一直接触和研究了形形色色的流媒体服务器,从最早的FCS(全称Flash Communication Server),后来改名为FMS(全称Flash Media Server),到Red5(java语言开发),到CrtmpServer(C++开发),让我对流媒体服务器的基本原理有了深刻的认识。当时...

weixin_28860509的博客 1447

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器。使用ffmpeg 命令推流到SRS 服务器,使用ffplay 命令 从 SRS 服务器拉流播放。OBS推流,拉流

1 安装和测试srs流媒体服务器1 安装和测试srs流媒体服务器服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS)推流端:ffmpeg + OBS拉流端:ffplay +VLC + srs播放器1.1 安装srs流媒体服务器官网码云的源速度快:github的源速度慢:.git第⼀步,获取SRS。将官网上废话删除,直接写关键点这个名字是随便取的,之所以取3.0,是因为学习的教程中就是用3.0教授的,实际版本已经有5.x了。

hunandede的博客 4784

EasyDarwin开源流媒体服务器

本文介绍一个十分实用的高性能开源 RTSP 流媒体服务器:EasyDarwin。

明天你好的博客 6294

nginx搭建流媒体服务器实现点播和直播

nginx搭建流媒体服务器实现点播和直播教程 - 源码文件 - 点击下载 前言 流媒体指以流方式在网络中传送音频、视频和多媒体文件的媒体形式。相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户边下载边观看,而不必等待整个文件下载完毕。由于流媒体技术的优越性,该技术广泛应用于视频点播、视频会议、远程教育、远程医疗和在线直播系统中。作为新一代互联...

江湖骇客 4378

基于SRS实现流媒体服务器(最简单的流媒体服务器

注意,推流地址,live:app名称,livestream:流名称。字段是可以更改的,每个自定义名字都是一个独立的视频流。官网提供了使用docker一键部署的方式,非常的方便快捷!采集来源有很多,可以选择屏幕和摄像头等。docker执行以后,访问。即可进入web管理页面。

秃了也弱了 1765

构建流媒体服务器:点播与直播服务的实现

流媒体技术是现代数字通信的核心技术之一,它允许音频和视频内容通过互联网以流的形式实时传输给用户,无需下载整个文件。流媒体服务器作为这一技术的核心载体,扮演着至关重要的角色。它不仅仅是内容的存储和分发中心,更是内容优化和用户体验提升的关键所在。在深入探讨点播和直播服务之前,我们需要对流媒体服务器的基础概念、功能及工作流程有一个全面的认识。本章将从流媒体服务器的定义、历史背景以及其在现代媒体生态系统中的位置展开,为读者构建一个关于流媒体服务器的全局视野。

weixin_42230607的博客 1045

实现一个高性能的HTTP-FLV流媒体服务器

在当今的互联网时代,流媒体技术已经成为传输音视频内容的核心技术之一。为了更好地理解和应用流媒体技术,开始学习并实现了一个高性能的HTTP-FLV流媒体服务器。HTTP-FLV是一种常用的实时流媒体传输协议,结合了HTTP协议的广泛兼容性和FLV(Flash Video)格式的高效性,非常适用于实时视频流的传输。在博客中,将详细介绍HTTP-FLV的基本概念,并分享在实现高性能HTTP-FLV流媒体服务器过程中积累的经验和技巧。Boost网络库【C++】开源:jsoncpp库。

control_0317的博客 1152

常见流媒体服务器方案对比分析

常见流媒体服务器方案对比分析

m0_60259116的博客 3788

只需三分钟,即可轻松搭建流媒体服务器自己搞直播!支持OBS Studio、XSplit等流媒体文件,

使用OBS进行推流,点击通道,可以看到正在推流的地址信息,比如http://10.0.8.2:8080/live/01.m3u8。(推流格式:协议://ip地址:协议端口/live/名字 如http://10.0.8.2:8080/live/01.m3u8 )点击通道,可以看到正在推流的地址信息,比如http://10.0.8.2:8080/live/01.m3u8。播放(拉流)地址:rtmp://10.0.8.3:1935/live/01。rtmp://IP+端口/live/名字2。

qq_28768477的博客 1万+

WEBRTC三种类型(Mesh、MCU 和 SFU)的多方通信架构

WEBRTC三种类型(Mesh、MCU 和 SFU)的多方通信架构 WebRTC 本身提供的是 1 对 1 的通信模型,在 STUN/TURN 的辅助下,如果能实现 NAT 穿越,那么两个浏览器是可以直接进行媒体数据交换的;如果不能实现 NAT 穿越,那么只能通过 TURN 服务器进行数据转发的方式实现通信。目前来看,Google 开源的用于学习和研究的项目基本都是基于 STUN/TURN 的 ...

weixin_40592935的博客 5008

常用流媒体服务器

以上这些服务器端本身都有各自的特点和开发的目标,因此有一些服务器端不一定完全能够满足用户自己的需求,用户需要根据其特性和自己的场景来加以取舍,最终需要用户根据WebRTC 服务器端的产品定位,功能,支持能力和自己的需求来决定选用哪种服务器。另外,根据视频会议是WebRTC的主要卖点,因此关于WebRTC的处理方式,很多开源媒体服务器的架构有有所不同,有的服务器端支持MCU方式,有的支持SFU方式,还有的WebRTC服务器支持混合方式。它支持视频会议,用户房间管理等非常灵活的功能,支持MCU模式。

程序猿老樊的博客 6041

搭建流媒体推流/拉流服务(RTMP/RTSP/HLS/HTTP-FLV)

搭建流媒体服务,将rtsp或者rtmp视频流转换为H5可以直接播放的视频。用在直播、安防监控、视频点播、屏幕画面转播等

Stronger的博客 3万+

学着搭建流媒体服务器

在aarch64上部署流媒体服务

lalee的博客 3925

如何快速的搭建简易的流媒体服务器

是一个基于Node.js的流媒体服务器,它提供了构建和管理实时音视频流媒体应用程序所需的功能。它是一个开源项目,具有灵活性和可扩展性,适用于各种流媒体应用场景。以下是一些RTMP支持:node-media-server 支持 RTMP(Real-Time Messaging Protocol)协议,用于接收和传输实时的音视频流。RTMP 适用于实时直播和互动应用等场景。多路并发流支持:node-media-server 具有多路并发流处理能力,可以同时处理多个流媒体的接收、转码、推流和录制等操作。

qq_42832540的博客 1911
上一篇: 一种高效流媒体服务器的设计
下一篇: 非阻塞socket 的连接
ruixj
博客等级 码龄24年 634粉丝 300原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值