Nginx Rtmp Module - HLS切片和级联播放
#Nginx Rtmp Module - HLS切片和播放
1、名词解释
媒体片段文件(.ts): 媒体片段是由源站生成的,基于编码后的媒体源,并且是由一系列的 .ts 格式的文件组成,其中包含了你想通过 rtmp流携带的 H.264视频和AAC 音频。对于纯音频的直播,切片器可以生产MPEG 基础音频流,其中包含了 ADTS头的AAC音频。
HLS直播索引文件(.m3u8): 由源站附带生成保存为 .m3u8 格式
下面是一个直播 .m3u8 的 playlist 文件样例,其中包含了三个没有加密的5秒钟的媒体文件:
#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:2#EXT-X-TARGETDURATION:5#EXTINF:5.000,1475217437694.ts#EXTINF:5.000,1475217442714.ts#EXTINF:5.000,1475217447698.ts
HLS点播索引文件(.m3u8): 由源站附带生成保存为 .m3u8 格式
下面是一个 点播 .m3u8 的 playlist 文件样例,其中包含了三个没有加密的5秒钟的媒体文件:
#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:2#EXT-X-TARGETDURATION:5#EXTINF:5.000,1475217437694.ts#EXTINF:5.000,1475217442714.ts#EXTINF:5.000,1475217447698.ts#EXT-X-ENDLIST #点播特有的标签
HLS直播: 直播就是实时事件的录制展示。它的索引文件一直处于动态变化的,你需要不断的更新索引文件 playlist 然后移除旧的索引文件。这种类型通过向索引文件添加媒体地址可以很容易的转化为VOD类型。在转化时不要移除原来旧的源,而是通过添加一个 #ET-X-ENDLIST 标记来终止实时事件。转化时如果你的索引文件中包含 EXT-X-PLAYLIST-TYPE 标签,你需要将值从 EVENT 改为 VOD。
HLS录播: 点播的特点就是可以获取到一个静态的索引文件,该文件包含一套完整的资源文件地址。这种模式允许客户端访问全部节目
2、HLS直播
当音频和视频数据经过SLB的负载均衡,打到任意一个lmss进程上之后,会分别被HLS直播和HLS录播模块处理,两个模块会根据自己的切片算法、索引文件生成算法 生成该模块对应的 m3u8和ts文件。直播模块会将这两个文件生成到内存虚拟硬盘,然后在HLS直播中被CDN请求使用。
接下来将分别介绍HLS直播及录播模块。
2.1、HLS直播
HLS直播分为两个子模块: 负责hls本地 级连播放的HTTP HLS模块和负责hls直播切片相关的RTMP HLS模块。
2.1.1 RTMP HLS模块
(1) 模块配置
本地配置如下:
server {application live {hls on; #是否开启hlshls_fragment 5s; #本地切片长度hls_playlist_length 15s; #HLS播放列表长度}}
(2) hook函数回调
static ngx_int_tngx_rtmp_hls_postconfiguration(ngx_conf_t *cf){ngx_rtmp_core_main_conf_t *cmcf;ngx_rtmp_handler_pt *h;cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);*h = ngx_rtmp_hls_video; #视频数据回调h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);*h = ngx_rtmp_hls_audio; #音频数据回调next_publish = ngx_rtmp_publish;ngx_rtmp_publish = ngx_rtmp_hls_publish; #流开始回调next_close_stream = ngx_rtmp_close_stream;ngx_rtmp_close_stream = ngx_rtmp_hls_close_stream; #流结束回调return NGX_OK;}
(3)HLS 对rtmp推流publish消息的处理(ngx_rtmp_hls_publish)
该函数主要用于初始化hls模块内存上下文。
(4) HLS对视频帧的处理(ngx_rtmp_hls_video)
对于视频数据,HLS直播模块会解析每一个rtmp数据包,提取出h264 nal数据,然后按照ts封装格式封装到ts文件里面。
(5) HLS对音频帧的处理(ngx_rtmp_hls_audio函数)
对于音频帧,该模块采用不同于视频帧的处理方式, 区别如下:
不同点 | video | audio |
dts | dts = timestamp * 90 | dts = (aframe_num * 90000 * 1024 / sample_rate) |
pts | pts = dts + cts * 90 | pts = dts |
帧处理 | 每一帧都写ts文件 | 音频帧缓冲区填满之后,一次写入ts文件 |
音频帧处理流程如下:
对于音频帧的处理,HLS直播模块采用了先缓存,然后一并切入ts文件的方式,这种方式对于减少磁盘的i/o有很大的好处,同时HLS直播模块对封装好的ts文件,会被写入虚拟内存硬盘,而不是普通硬盘的目的,也是为了提高磁盘i/o的效率。
(6) HLS 切片处理(ngx_rtmp_hls_update_fragment)
该函数主要负责hls直播的核心切片逻辑。
切片流程如下:
其中蓝色的部分是生成新的ts分片的逻辑:
- (1)当前ts片的长度大于1.2倍的fraglen,即向上浮动20%,且强制切片
- (2)遇到视频关键帧并且ts片的长度大于0.8 倍的fraglen,即向下浮动20%
- (3)出现异常情况,时间戳跳变,比如音视频时间戳变小,则当系统时间超过3倍的切片fraglen长度,强制切片其中红色的部分会在更新m3u8列表的时候,添加discontinue标签
- (1)出现第三种强制切片逻辑时,则会在下一个ts分片的m3u8列表里,添加discontinue标签
- (2)出现异常情况,时间戳跳变,比如相邻的音频或者相邻的视频 时间戳变小,则会在当前ts片,添加discontinue标签
(7) HLS 对rtmp推流结束消息的处理(ngx_rtmp_hls_close_stream)
该函数主要清理模块的上下文。
(8) .m3u8索引文件生成算法
下面是一个直播 .m3u8 的 playlist 文件样例:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:2
#EXT-X-TARGETDURATION:5
#EXTINF:5.000,
1475217437694.ts
#EXTINF:5.000,
1475217442714.ts
#EXTINF:5.000,
1475217447698.ts
对于HLS直播: .m3u8索引文件只会存储最新的几片ts文件,每生成一个新的ts文件就会更新索引文件,然后移除旧的索引文件,意味着它的索引文件一直是动态变化的。
.m3u8可存储的ts数目 = hls_playlist_length/fraglen
(9) ts片清理逻辑(cleanup)
客户端播放HLS直播,只会播放m3u8索引里面存储的最新的ts文件,ts文件一旦从m3u8文件里面清除 ,即ts文件过期,LMSS将会做定期的清理这些文件。但是由于小部分网络不好或者延时较大的用户,可能仍会请求一些刚从m3u8列表清除的ts文件,所以文件清除的时间会比过期时间要大,规则如下:
name | 取值 |
扫描 目录 | /dev/shm |
扫描 周期 | 30s |
ts清除时间 | hls_playlist_length * 2.5 |
m3u8清除时间 | hls_playlist_length * 1 |
原理如下:
nginx: cache manager进程会每隔30s,扫描“/dev/shm”目录,然后获取每一个文件最后的更新时间,
如果当前时间 - 最后更新时间 > 清除时间, 则删除该文件
2.1.2 HTTP HLS模块
hls级连架构图:
目前级连有三种不同的方式:
1. 远程级连(位于不同机器上的lmss进程级连)
2. 跨集群级连 (位于不同集群之间的lmss进程级连)
hls级连交互图:
流程如下:
1. 推流端推送音视频数据到任意一台源站lmss A,lmss服务器 A进行hls切片。
2. 播放端跟lmss B 请求.m3u8和.ts文件。
3. lmss B 发送http请求到lmds服务器,获取级连信息。
4. lmss B尝试从本地读取文件,如果有则直接发送,否则从源节点请求数据。
---------------------
作者:kingsoft-踏锋
来源:CSDN
原文:https://blog.csdn.net/liwf616/article/details/77886991
版权声明:本文为博主原创文章,转载请附上博文链接!
Nginx Rtmp Module - HLS切片和级联播放相关推荐
- nginx rtmp module 代码详解 各模块主要功能
ngx_rtmp_dash_module http模块里播放MPEG-DASH相关处理 ngx_rtmp_mp4_module 主要支持rtmp MP4这块点播相关功能,支持seek操作 ngx_rt ...
- Nginx RTMP 功能研究
Nginx-RTMP功能调研 1. RTMP协议介绍...2 2.RTMP server.3 2.1当前的流媒体server.3 2.2Wowza功能...3 3.Nginx-based RTMP s ...
- [转]Nginx RTMP 功能研究(Nginx流媒体)
转自:http://blog.csdn.net/cccallen/article/details/8440191 看点: 1. Nginx 配置信息与使用. (支持 rtmp与HLS配置) 2 ...
- ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制
ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制 2014年 四月 19日 周六 | tags: ffmpeg, rtmp, rtmpdump, nginx, -- (perm ...
- 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
引言 最近在测试LiveGBS时遇到了部分手机上无法正常播放HLS直播流的问题.LiveGBS的介绍参考主要功能是能同时接入区域或公网中多路安防摄像头或者硬盘录像机等设备,拉取实时流和录像数据,同时输 ...
- nginx rtmp HLS直播
2019独角兽企业重金招聘Python工程师标准>>> 二.安装Nginx相关模块 1.环境准备 yum install –y pcre pcre-devel yum install ...
- nginx rtmp 服务建立 全套代码,含直播、播放、录制、转码
有关nginx和rtmp编译这里就不介绍,本文仅记录有关rtmp模块的有关配置 配置环境在Centos下 服务配置 在nginx.conf中插入 rtmp {server {listen 1935;# ...
- 微信小程序 RTMP 音视频 通话 ffmpeg_音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查...
问题背景: 前两天看读者留言让再写写音视频问题排查方面的思路,前面大概写几篇:<音视频播放疑难杂症分析和解决 :序篇>.<音视频常见问题分析和解决:延时和抖动>.<记一次 ...
- 最简单的基于Flash的流媒体示例 网页播放器(HTTP,RTMP,HLS)
===================================================== Flash流媒体文章列表: 最简单的基于Flash的流媒体示例:RTMP推送和接收(Acti ...
最新文章
- ceph-dencoder工具使用详解
- HDU1527(博弈论)
- AI芯片,看好云端还是边缘?
- 当周期信号的频率趋向无穷时,它将消失
- intel服务器最新主板芯片组,intel主板芯片组的介绍
- 9月11日学习内容整理:正则表达式,re模块
- Second Highest Salary --leetCode
- 一带一路专题:农业、经济、地理距离、友好城市等七大维度面板数据
- 《学会提问》-批判性思维
- fatal: unsafe repository is owned by someone else 的解决方法
- ios微信公众号分享自定义分享无效
- 关于Java八种原始数据类型
- 最新,最严谨的手机号校验
- Bootstrap 组件:面板组件(panel)
- (六)CDA 数据分析师Level1考试新版大纲解析(自己整理)PART 6业务数据分析
- SHOW TABLES语法
- CTF夺旗赛培训——Web应用安全
- TCP/IP详解:TCP——超时和重传
- yjh的实习生涯之自动化测试(1)---初识uiautomator(uiautomator的使用和基本方法)
- java 通用内存分页(List分页)