基于Gstreamer的实时视频流的分发

1  Overview

Gstreamer是一款功能强大、易扩展、可复用的、跨平台的用流媒体应用程序的框架。

该框架大致包含了应用层接口主核心框架以及扩展插件三个部分。



   Fig 1.0Gstreamer


应用层接口主要是给各类应用程序提供接口如:多媒体播放器、流媒体服务器、视频编辑器等;接口的形式多样化,可以是信号、回调函数、函数调用等。

主核心框架就是流媒体的实际运行框架,其包含了媒体处理、内部消息处理、数据的网络传输、以及插件系统实现的功能等;主核心框架又包含了一系列的子模块称之为element,每个element完成一项单一的功能,通过Pipeline把其串联起来实现一条媒体流的实现。

扩展插件还是以主核心框架为基础,提供一些额外的服务,如:协议的组件、部分格式编解码的实现、以及第三方的一些Utility。核心框架会提供一些虚化的接口给各类插件,各类插件只需按照规则实现那些虚化的接口,核心框架就会具有相应的能力(类似父类和子类的关系)。

以Gstreamer为核心,构造了一套关于流媒体实时视频的获取、存储、转发综合方案,并实现了数据获取与转发相分离、支持多协议并发输出、低延迟、高可靠等特性。

该方案用到了Gstreamer的元素作为支撑,包括了数据的获取和转发两大功能体。因为获取到的数据要支持多路径转发,所以必须将其转换成ts包格式。



 fig 1.1 module chart


2. 视频获取单元

总体功能:从IPC获取实时视频数据,可用于转发或存贮。

总体实现:视频获取单元用Gstreamer的一条Pipeline实现,包含如下元素:

rtspsrc: 连接rtsp 服务器,并获取RTP 包,所有行为遵守RFC2326;

rtph264depay: 从RTP 包中解出H264包,所有行为遵守RFC3984;

mpegtsmux: 把mpeg的传输流封装成ts包;


fig 2.0 video fetch pipeline

 

2.1rtspsrc

模块功能:rtspsrc用于连接rtsp Server(IPC端)并获取数据。

其做为一个SRC仅仅是用于接收数据,并不做任何处理直接交给下游模块。所以他的输入和输出数据都是RTP包。接收数据前,rtsp Session的建立是通过与对端交互SDP消息完成的,完全遵守了RFC2326。

用户层使用rtspsrc时,只需要正确配置所有控制参数,该模块就会完成如下功能:SDP消息交互,RTP stream的接收,RTP包的输出(PUSH mode)。同时,rtspSrc给应用层提供一系列接口,使其可以参与整个Session建立过程,这些接口都是以Callback形式给出。

handle-request : Gstreamer可以让应用去处理服务器的rtsprequest 和 response;

on-sdp:每收到sdp消息,Gstreamer可以让应用层增加处理;

select-stream: 每次Gstreamer对接收到的stream加以caps设定时,让应用层有机会处理;

如果应用层忽略这些Callback,那Gstreamer就会按照标准流程走下去。

下图中列出了rtspsrc支持的控制参数,包含了:底层的传输协议选择、发送队列缓存区的大小、是否支持丢包重传等参数。

 

把该模块加入Pipeline中并开启Pipeline,完成如下功能:

1.  与服务器交互SDP报文,建立rtsp session;

2.  通过Session获取RTP 流;

3.  通过PUSH的模式把RTP包交给下游模块;

 

  fig 2.1 rtspsrc work scope


模块实现:Gstreamer

 

 

 

2.2 rtph264depay

模块功能

1.  做为rtspsrc的下游模块,可以接收到rtp包,

2.  并遵循RFC3984的规范解包,解完的包会按照NAL的格式对齐;

3.  NAL包以PUSH的模式交给下游模块。

 

模块实现:Gstreamer

 

2.3 mpegtsmux

模块功能:把媒体流数据(mpeg格式的)封装成ts包的格式并输出给下游模块。

 

模块可选的控制参数

m2ts-mode:选择188字节或192字节的ts包;

prog-map:节目流映射;(此参数不明白)

pat-interval:发送ts包净荷是节目关联表的时间间隔;

pmt-interval:发送ts包净荷是单路节目复用信息的时间间隔;

alignment:发送给下游模块的每块Buffer的TS包的个数;

si-interval:发送Service Information的时间间隔;

 

模块实现:Gstreamer

 

2.4 appsink

模块功能:允许应用程序获取处理后的数据。

 

模块可选的控制参数

drop:丢弃策略,当Buffer满了以后是否丢弃数据;

max-buffers:设定Buffer队列的个数;

GST_PAD_PROBE_TYPE_BUFFER:可以注册回调函数获取经过appsink的所有Buffer;

 

模块实现:Gstreamer

 

Appsink获取的Buffer都是ts包格式的,获取后有多种处理方式

1.  以ts文件的形式保存;

2.  以buffer的形式进行管理;

3.  直接丢给各个转发模块;


3  转发实体

对于获取的视频数据有3种转发的方式

3.1 HLS转发

总体功能

控制面,建立HttpServer,接受客户端的请求并给出回应;

数据面,通过Socket接口,把接收到的ts包Buffer传给客户端;

总体实现 :与Gstreamer无关,HttpServer用Libevent实现;


Figure 2-1 HLSSolution Service Flow

 

Step1 : 开启Gstreamer去捕获IPC的RtpStreaming并交给PipeLine,经过h264depay和Mpegtsmux 的处理后,AppSink的probe可以hook到ts packet Buffer ;

Step2: 开启HttpServer监听指定端口;

Step3:Client发送Get m3u8File Request,Server收到后回复200OK和相应m3u8文件;

Step4:  Client根据m3u8文件里的ts文件列表RequestGET;(这里是segment00.ts)

Step5:  Server收到segment00.ts文件请求后Response200 OK 和“Connection keep alive”;

Step6: HttpServer驱动Appsink 的Probe通过Socket把hook到的buffer实时往Client发送; (如果多个客户端,将轮询所有客户端进行转发)

Step7: Client侧的HttpClient收到Buffer后实时PUSH ts Buffer to Gstreamer Appsrc;

Step8: Client侧的Gstreamer的PipeLine经过Appsrc,tsdemux, h264parse, avdec_h264, glimagesink对live streaming media进行播放;


3.2 rtsp server 转发

总体功能

控制面,构造rtsp server,负责与客户端的rtsp请求与回复;

数据面,构造rtp stream, 把上游输入的ts包buffer转换成rtp格式,并通过Rtsp协议发送给客户端;

 

总体实现:Gstreamer


  fig 3.0 rtp stream produce

 

由Gstreamer构造的一条Pipeline,从上游的appsink接受数据,进行格式转换并交给rtsp server 发送出去。

 

3.2.1  Appsrc

模块功能:做为Pipeline的开始节点,允许应用程序往Pipeline“喂送”数据。

 

模块控制参数

block: 每块推送buffer块的最大字节;

current-level-bytes:当前队列的大小;

is-live:当前推送的是否直播数据;

max-bytes:缓存队列的最大容量;

max-latency:流数据在该模块的最大延迟时间;

min-latency:流数据在该模块的最小延迟时间;该值设为-1表示无延时发送。

min-percent:设定队列缓存数据的比例,当缓存数据小于该值时appsrc向pipeline发出“need data”信号;

size:流媒体数据的字节数,一般用-1表示未知;

stream-type:流媒体类型,GST_APP_STREAM_TYPE_STREAM表示实时数据不支持seeking操作;

 

注册的信号

“need data”:每当appsrc的Buffer需要数据时,该信号会被抛出,回调函数被触发;

“enough data”:每当appsrc的buffer即将溢出时,该信号会被抛出,回调函数被触发;

 

注册的接口

“push buffer”: 应用程序需要往往appsrc喂数据,该接口可以被调用;

 

3.2.2 tsdemux

模块功能:mpegtsmux的逆操作,把ts包恢复成mpeg2格式。

 

模块实现:Gstreamer

 

3.2.3 h264parse

模块功能:解析H264流,输出数据为AU对齐的流

 

模块控制参数

disable_passthrough: 为1表示强制按照h264规格解析输入数据,主要是针对一些不被信任的输入数据;为0表示根据标准行为去解析或不解析输入数据;一般选择0;

config-interval:发送PPS,SPS的时间间隔(SPS会被复用在数据流中);

 

模块实现:Gstreamer

 

3.2.4  rtph264pay

模块功能:把H264 视频数据编码进RTP包(遵循RFC3984)

 

模块控制参数

Mtu:包的最大字节数;

Pt:包负载的类型;

Ssrc:指定包的ssrc值,默认是随机值;

Timestamp-offset:时间戳起始值,默认随机值;

Sequencenumber-offset: sequence number的起始值,默认随机值;

Max-ptime:一个包含的视频最大长度(ns为单位),-1表示无限制,取决于MTU;

Min-ptime:一个包含的视频最小长度(ns为单位),-1表示无限制,取决于MTU;

Timestamp:最后一个包的时间戳;

Sequencenum:最后一个包sequence num ;

Ptime-multiple: buffer大小需是packet time的倍数;

config-interval:发送PPS,SPS的包的时间间隔,也就是IDR frame的时间间隔(SPS会被复用在数据流中);

 

模块实现:Gstreamer

 

3.2.5 rtpbin

模块功能:rtpsession +rtpjitterbuffer + rtprtxsend + rtprtxreceive

Rtpsession:建立rtp session 并分配SSRC,接收发送RTP包,调度发送接收RTCP包,实现了RFC3550;以上行为需要基于RTSP Session的协商结果。

Rtpjitterbuffer:缓存数据流,根据配置等待需要重传的RTP包,并及时察觉未收到的RTP包触发rtpsession发送FBNACK(RFC4585),发送重传事件给 Rtprtxreceive;

Rtprtxsend:按照配置保存一定量的RTP包,收到rtpsession的重传指示,查找目标RTP包按照RFC4588的规范重新发送;

Rtprtxreceive:根据从Rtpjitterbuffer接受到的重传指示,按照RFC4588的要求,把重传流的SSRC2映射到主数据流SSRC1(RFC 4588),把数据包交给下游的Rtpjitterbuffer;


   Fig 3.1  Lost rtp packet retransmission with both peer

     

如果不考虑重传,rtpbin的功能就等同于rtpsession(RFC 3550)

 

rtpsession控制参数

Bandwidth:RTP Session的带宽;

Internal-session:

ntp-ns-base:基于running_time0的网络基准时间;

num-active-sources

num-sources:

rtcp-fraction:RTCP的带宽;

sdes:数据加密算法的选择;

rtcp-rr-bandwidth:用于接收RTCP的带宽;

rtcp-rs-bandwidth:用于发送RTCP的带宽;

use-pipeline-clock:用Pipeline的时钟去设定RTCP SR的ntp;

probation:为了判断Source是否有效的,用于试用的连续报文个数;

rtp-profile:一般是视频音频类型,GST_RTP_PROFILE_AVP;


rtpbin控制参数

do-lost:是否丢包后往下游发送事件;

latency:jitterbuffer中缓存的buffer长度;

ignore-pt:是否忽略pt值;

autoremove:自动删除超时的数据源;

JitterBufferMode:控制jitter里buffer和时间戳的模式;

ntp-sync:buffer里的时间是否和ntp同步;

rtcp-sync:rtcp包里的时间和ntp的同步模式;

rtcp-sync-interval:rtcp数据的发送间隔;

drop-on-latency:超过jitterbuffer缓存区范围是否丢弃;

do-sync-event:是否可以向流的下游模块发送同步事件;

do-retransmission:是否支持rtp包的重传;

 

模块实现:Gstreamer

 

rtsp server

模块功能

构建rtsp server,与客户端进行信令交互,控制数据收发;

 

模块工作原理

控制层面:

1.  服务器端每接入一个客户connection就会创建一个Client对象,所有的rtsp信令层的交互都由Client对象处理;

2.  Client和客户端SDP协商完毕会创建Media对象;

3.  Client收到SETUP请求会创建Session,并把Media加入到该Session;

4.  所有的控制层面的信令都由Client-〉Session-〉Media去处理;

5.  Media会通过Factory接口创建Pipeline,并把Pipeline和RtpBin连接生成Stream对象;

6.  Rtsp Session通过StreamTransport对象把数据通道的一些参数交给Stream;

7.  Stream建立数据传输的通道;

转发层面:

1.  Stream建立并收到对端的PLAY请求,RtpBin会向Pipeline的源头Appsrc要数据;

2.  Appsrc产生“need_data”的信号;

3.  上游的appsink模块会把数据(ts packet)buffer,feed给Appsrc;

4.  ts包经过Pipeline的处理组成RTP包到达rtpbin;

5.  rtpbin,最主要的是rtpsession会把收到的rtp包交给udpsink模块做下一步发送;

 

模块实现:Gstreamer

 

3.3 rtmp 转发

总体功能

控制面,构造rtmp server;

数据面,构造rtmp stream,把接收到的ts buffer转换成rtmp stream格式,交给rtmp服务器发送给客户端;

实现:控制面由SRS实现,数据面由Gstreamer实现;



 Fig3.3  ts transfer to rtmp stream

 

encodebin:把h264数据转换成flv格式,由Gstreamer实现;

rtmpsink:把flv数据转换成rtmp stream并传送给rtmpserver,由Gstreamer实现;

rtmpserver:模块把rtmp stream按rtmp协议转发给客户端;

  

3.4 Service model


     fig 3.4 service model

 

1.      一台Server可在多个IPC上获取数据;

2.      获取的数据可以多路协议转发;

3.      每路协议支持多客户端实时转发;

 

 

4  Prototypeverification

经过原型验证,RTMP、HLS和RTSP的转发,在网络效果良好的情况下经过参数合理配置,可以达到低延时的效果(300ms)。

RTMP、HLS的底层传输都是TCP连接,提供了可靠的传输环境;Rtsp Server的RTP可选UDP,并引入RTP的重传机制,也可保证传输质量。

因为是实时编码,所以IPC输出的H264是不包含B帧的,Gstreamer为解析H264的B帧所设定的700ms的帧同步延时可以省略,提高了实时性。







本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT还没玩明白,自主人工智能已经来了

Datawhale干货 最新:AutoGPT,来源:机器之心 OpenAI 的 Andrej Karpathy 都大力宣传,认为 AutoGPT 是 prompt 工程的下一个前沿。 近日,AI 界貌似出现了一种新的趋势:自主人工智能。 这不是空穴来风&#x…

炸裂!Hugging Face 发布重磅更新,人手一个 AutoGPT!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! Hugging Face,作为 AI 开源圈最为知名的「网红」创业公司,成立仅几年,便在 GitHub 开源了诸多实用开源项目,受到了不少开发者的赞赏。 其中影…

这对情侣火了,你猜是因为啥

注意看,这张情侣照在网上转疯了: —— 本文转载自量子位 旧厂街风格,带着浓浓90年代氛围感,但是,他俩一夜爆火的原因,你可能想象不到—— 这二位并不是真人!而是由AI一键生成的! &am…

OpenAI 发布 GPT-4 ,功能炸裂!网友:真人工智能更近一步!

编辑:金磊 梦晨转自:量子位 | 公众号 QbitAI 一觉醒来,万众期待的GPT-4,它来了! OpenAI老板Sam Altman直接开门见山地介绍说: 这是我们迄今为止功能最强大的模型! 有多强? 根据OpenA…

Redis Plus 来了,性能炸裂!

点击关注公众号,Java干货及时送达 学习 Spring Cloud 微服务的正确姿势! 用上 ChatGPT 啦,强的离谱! 博客园在绝境求生。。 来源:https://developer.aliyun.com/article/705239 1 什么是KeyDB? KeyDB是Redi…

OpenAI 重磅发布 GPT-4 !ChatGPT 炸裂大升级,直接能考上哈佛,抢先体验后我慌了...

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! ​ 一觉醒来,万众期待的GPT-4,它来了! OpenAI老板Sam Altman直接开门见山地介绍说: 这是我们迄今为止功能最强大的模型! …

QQ、微信、lol自动发消息工具

写了一个电脑自动发消息的工具,脱离双手,让我们聊天更方便跟简洁! 电脑软件。 自动发消息,双手离开键盘!能设置次数和发送间隔。 ​​​​​​链接在这:阿里云盘分享提取码:51ar 一定要先看…

AIGC的下一步,AIGA改写企业软件

▎在AIGC产品里,我们已经证明了生成式自动化在大模型和超级自动化时代是完全可行的。 编者按: 贾岿博士是弘玑Cyclone首席产品官,曾担任UiPath全球研发中心高级研发总监、微软Azure云计算主任架构师。弘玑Cyclone 是一家专注于RPA的厂商&…

zblog仿站必看!附加zblog所有必备标签调用规则和中文说明

Z-Blog是一个开源的PHP博客程序,具有轻量、简洁、易用等特点,非常适合新手搭建个人博客。以下是Z-Blog仿站教程,包含了基本的代码示例。 1. 下载Z-Blog程序并安装 首先,需要到官网下载Z-Blog程序,解压缩后上传到服务器…

老板用了ChatGPT后,决定扩招40%程序员...

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 陆奇在最近的分享中提出一个观点:“生成式AI,不会抢程序员的饭碗,相反会增加程序员的岗位。” 理由很简单,AI大幅提升程序员的工作效率,同样…

只需要两步就能快速接入GPT

缘起 最近一个朋友提出,让我出个关于如何快速接入GPT的教程,今天就给大家安排上。 需要的工具 经过实测,这是迄今为止最便捷的接入方式,而且亲测有效。 首先,第一步你需要下载最新版的微软Edge浏览器,去…

强推宝藏网站

最近还是有很强烈的感受,方法大于努力。最近就整理了一下大学期间比较好用的网站,也陪我度过了一段时间了,排名不分先后,把压箱底的东西拿出来了。 ChatGPT WeTab 新标签页https://www.wetab.link/ 这个就不用多说,最…

如果让chatAI来写代码,会是怎么样的效果?

近日,我在刷B站的时候看到了由UP主老耗游戏发布的这个视频这下键盘不会废了! 在这个视频中,我了解到了这个网站:WeTab新标签页,也在这个网站中真正的接触到了ChatAI。 这个网站的chatAI功能实际上还是需要下载安装如谷…

GPT免费网站分享(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

一个iPhone/iPad可以无成本使用GPT的方法

WeTab新标签页 虽然gpt已经上线app store,但是国内的iPhone用户还是无法快速拥有。而最近WeTab新标签页上线了iOS和iPadOS端,直接在app store就能下载,并且无使用成本。 一直以来WeTab新标签页的PC端浏览器插件就受到了很多用户的喜爱&…

大数据看惊天逆转+绝杀,亚洲杯时隔16年夺冠,恭喜女足

在北京时间2022年2月6日晚结束的女足亚洲杯决赛中,在上半场0:2落后的局面下,’ 中国女足下半场5分钟连进两球,顽强扳平比分。 在随后的比赛中,中国女足在伤停补时阶段又打进1球,以最终比分3:2夺冠! 第9次夺…

程序员也为你骄傲~恭喜2022年女足夺得亚洲杯冠军~中国冠军~

今天是正月初七,虎年开工大吉的日子。 想想昨天女足夺冠的场景,还是很激动! 今天这版面留给特别的女足! 北京时间2月6日晚,中国国家女子足球队3比2逆转乾坤,战胜韩国女足,第9次捧起亚洲杯冠军…

C站CatGPT,对标ChatGPT,C站赢麻了

前言: 最近AI确实很火,而且也被炒的很高。针对日常程序开发有什么帮助呢?对于C站的爱好者,今天来聊聊CatGPT。 一、 使用入口 1、猿如意-CatGPT 猿如意为C站为程序猿开发的专业软件,其中使用几个月的感受来看&#xf…

【综合】体育比赛高手榜

【综合】体育比赛高手榜 虽然但是,还是不建议同学们直接抄我的代码_(:з」∠)_,我写博客的主要目的还是提供思路,代码也不一定就是最优解,有写的不清楚的部分或者是有更好的算法都可以留言awa 背景 某地举办冬季体育比赛&#…

张家俊:ChatGPT八个技术问题的猜想

Datawhale干货 作者:张家俊,中国科学院自动化研究所 转载自 | 机器学习与自然语言处理 看到ChatGPT的华丽诞生,心情很复杂,既高兴、惊喜,也感到恐慌,高兴和惊喜的是没有预料到这么快就见证了自然语言处理&…