引言
直播后台包括信令服务及流媒体服务。信令服务主要接收外部业务请求,进而控制流媒体的行为(包括创建/停止频道、转码、录制等),本文主要讨论流媒体的工作原理。
一、目的
很容易想到的是数据分发功能,解决观看带宽问题。但实际上还包括了一系列的可扩展功能,比如后台统一转码,视频录制以及流状态控制(外部审核)。
二、RTMP(直播后台核心逻辑)
直播采用的是RTMP协议进行传输数据,不仅包括客户端与服务端之间音视频传输(直播/观看),也包括服务端各节点之间数据的传输。按照实际使用经验,RMTP直播效果优于hls、http/flv,延迟在1-2秒左右。
RTMP包含一系统AMF命令:
发布方:(connect->createstream->publish)
观看方:(connect->play->onmetadata)
对于发布方/观看方来讲,RTMP层的业务握手完成后,会发送AMF命令与服务端进行交互,最终再传输音、视频数据。
三、与信令服务通信
流媒体运转过程中,避免不了与外界信令服务器进行通信,通过信令服务器发送自定义TLV指令,来控制整个直播过程。与信令服务器通信包含主动发送请求(作为tcp_client)及被动接收请求(作为tcp_server)。
主动发送请求:
流媒体作为tcp_client,可以使用nginx中的ngx_peer_connection_t实现,peer_connection_t作为主动连接与外部建连。
pc = ngx_pcalloc(pool, sizeof(ngx_peer_connection_t));
if (pc == NULL) {
goto error;
}
//设置连接参数
...
rc = ngx_event_connect_peer(pc);
if (rc != NGX_OK && rc != NGX_AGAIN ) {
ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "netcall: connection failed");
goto error;
}
被动接收请求:
流媒体作为tcp_server,需要开启一个自定义端口监听外部请求。借助开源nginx_tcp_proxy_module模块,通过代理请求到自定义的ngx_tcp_protocol_t实现。
ngx_tcp_process_session(ngx_connection_t *c)
{
....
cscf->protocol->init_session(s);
}
epoll:
流媒体后台IO的读写是基于epoll事件驱动方式。鉴于此,tcp_server、tcp_client也采用此方式,开发中实际就是处理事件的回调函数.读写事件的触发交由epoll去实现,降低了开发成本,并且epoll处理高并发连接的效率很高,适合直播这种场景。
struct ngx_event_s {
....
ngx_event_handler_pt handler;
}
四、数据流转
流媒体数据流转顺序:
client推流至publisher,publisher分发至dispatcher,再由dispatcher转发至叶子节点,提供给客户端进行观看。client->publisher->dispatcher->edge->client
转码流转顺序:
client推流至publisher,publisher分发至transcoder转码,再由dispatcher转发至叶子节点,提供给客户端进行观看。client->publisher->transcoder->dispatcher->edge->client
简要流程图:
五、缓存GOP
一个GOP包含一组视频帧(I、B、P、B、B、P、B帧),只有I帧可以独立解码,所以如果服务端第一帧发送的是B或者P帧,则客户端会出现黑屏。缓存GOP实际主要是解决保证客户端收到的第一帧为I。这里需要注意的一点是缓存的是一组GOP,即当前所属的GOP,而非一个I帧,单独一个I帧,一样会造成显示模糊,卡顿。
其它注意点:
1.发送I帧前还需要发送sps帧,sps包含编码所用的profile,图像的宽和高等信息。如果不发送,则视频不会显示。
2.视频帧的timestamp设置:与缓存flv的视频帧不同,rtmp视频帧timestamp不能设置成0。SPS帧可设置成0,其它帧以相对时间为准。
六、监控
监控流量不可避免,此处把进出带宽打印下来,对于定位问题有很大帮助。可以实时查看收发包的流量信息。
- 大小: 62.6 KB
- 大小: 52.7 KB
- 大小: 18.4 KB
- 大小: 125.1 KB
分享到:
相关推荐
浅谈PHP语言在网站后台建设中的优势 PHP语言是一种服务器端脚本语言,广泛应用于网站后台建设中。它的优点包括跨平台性、开源性、数据连接性、运行高效性、安全性等。PHP语言可以与多种主流数据库建立连接,如MySQL...
SAP 系统前台数据与后台表之间的关系优质资料 本文将深入探讨 SAP 系统前台数据与后台表之间的关系,详细介绍了四种方法来关联前台数据与后台表。 在 SAP 系统中,用户在进行日常业务的过程时,经常会因为操作不...
传输综合网管和c、g网网管系统后台采集也和整个系统一样,存在大量的问题。例如,告警处理不过来,资源同步,确认效率低等等。而这些问题都制约产品进一步发展,所以后台采集统一改造事在必行。因为框架搭建是程序...
这包括优化查询语句以减少CPU消耗,合理配置并行执行策略,以及监控和调整后台进程的CPU使用。 【SQL语句优化】 SQL语句优化是数据库性能提升的核心环节。DBA应监控慢查询,通过编写更高效的查询语句、创建合适...
3. SQL Server数据库介绍:SQL Server 2000是微软的一款关系型数据库管理系统(RDBMS),在文档中被用作后台数据库。SQL Server为存储、查询和操作数据提供强大的支持,是企业级应用广泛采用的数据库解决方案之一。 ...
用户只需通过微信扫一扫或搜索,即可打开所需的小程序,使用完毕后即刻关闭,不占用后台资源。 【小程序的特点与优势】 1. **轻量化**:小程序无需下载安装,节省了用户的手机存储空间,同时也避免了应用程序更新...
本文将浅谈单片机程序架构,讨论怎样架构单片机程序,总结大致应用程序的架构有三种:简单的前后台顺序执行程序、时间片轮询法和操作系统。 1. 顺序执行法 顺序执行法是大多数人使用的方法,不需思考程序的具体...
本文介绍了浅谈android性能优化之启动过程(冷启动和热启动) ,分享给大家,具体如下: 一、应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用时,后台没有该应用的进程,这时系统...
这篇博客文章“浅谈Quartz(WEB)”可能探讨了如何在Web应用中集成和使用Quartz。 首先,Quartz的核心概念包括作业(Job)、触发器(Trigger)和调度器(Scheduler)。作业是实际要执行的任务,触发器则定义了何时...
### 浅谈CSRF攻击方式 #### 一、CSRF是什么? CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击手段,它利用用户在浏览器中保存的有效凭证(如Cookie等),通过伪装成受害者的身份对目标...
客服人员需要具备快速定位产品的能力,这就要求客服人员对后台产品信息有充分的了解和熟悉,以便能及时回应客户询问。在实际操作中,为了提高响应速度,客服人员需制作并及时更新快捷短语,以减少沟通时间,提高沟通...
《浅谈变电站后台机网络安全管理》一文深入剖析了电力行业中变电站后台机的网络安全问题,特别是结合了2015年乌克兰电网遭受的恶意软件攻击事件,警示了网络安全的重要性。该事件揭示了黑客利用BlackEnergy等恶意...
"浅谈单片机应用程序架构" 单片机应用程序架构是指在单片机系统中对程序的架构设计和实现。本文档将总结归纳单片机应用程序架构的相关知识点,并对其进行分类和比较。 一、简单的前后台顺序执行程序 这种方法是...
在前后台数据交互中,前端负责展示数据,并通过AJAX等方式向后端发送请求获取数据,而后端处理请求并返回数据给前端。在此过程中,前后端数据传递的方式、数据的组织、数据格式的正确性以及网络请求的成功与否都可能...
一些Base64编码的问题,我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了。如果您对二进制数有所了解,你就可以开始读它了。
"消防无人机浅谈.pdf" 本文档主要讨论了消防无人机在灾害救援和现场侦测中的应用。随着无人机技术的成熟和航空摄影技术的进一步拓展,我国民用无人机应用领域日益广泛,包括摄影测量、应急救灾、公共安全、资源勘探...
Vue 后台管理系统权限控制是构建复杂Web应用中不可或缺的一部分,它确保了用户只能访问他们被授权的功能和数据。在本文中,我们将深入探讨如何在Vue框架下实施有效的权限控制系统,以及解决相关安全问题。 首先,...
### 浅谈Android线程模型:深入理解与实践 #### 引言 随着智能手机的普及和技术的不断进步,Google的Android操作系统成为了移动设备领域的重要力量。Android不仅为用户提供了丰富的功能,也为开发者提供了广阔的...
后台技术处理用户的请求,与数据库交互,完成实际的数据操作。常见的后台编程语言有ASP、ASP.NET、JSP和PHP。PHP是最受欢迎的选择之一,其语法简洁,功能强大,可与Java相媲美。PHP的流行在于它的易学性、高效性和...
可以在网页的链接附上需要提交的参数,当用户点击链接后,浏览器发起向链接的访问,从而也把链接附带的参数提交到后台,这种方式提交后页面也会刷新。 3、通过ajax提交 Javascript支持ajax方式创建HTTP请求,可以...