NodeMediaServer开启HLS功能

193 阅读3分钟

简介

HLS是目前浏览器无插件直播兼容度最高的协议,但是存在延迟大的问题。 http-flv普遍可以达到秒级甚至毫秒级延迟,HLS在Apple官方推荐的参数是10秒一个切片,一个m3u8列表包含3个ts切片,这就是为什么大部分HLS协议延迟30秒的原因。

nms 支持自定义切片时长和列表长度,默认配置未开启HLS,因为开启后会产生文件IO, 若有这方面需求请手动开启。

开启方式

打开config.ini

[hls]
# hls_path 切片临时存放路径, 必须填入有效且可写入的路径. 若不设置路径, 则不会开启hls服务\生成hls切片
hls_path = hls
# hls_time 切片时间, 单位秒, 默认2
# 经过这段时间后,将在下一个关键帧上剪切片段. 并不代表肯定会以这个设定值而切片,还要根据关键帧间隔而定.
# 低切片可有效降低hls延迟, 但也需要推流端使用固定的低关键帧间隔编码, 如果不固定关键帧间隔,会造成视频卡顿
hls_time = 2
# hls_list 最大播放条目, 默认3
hls_list = 3
# hls_allow_cache 显式设置客户端是否缓存媒体段。
hls_allow_cache = false

延迟说明

hls_time = 2 
hls_list = 3 

代表每2秒切片一个ts,m3u8列表中保持3个ts,这样算下来,延迟是6秒。

极限低延迟

hls_time = 1 
hls_list = 2

代表每1秒切片一个ts,m3u8列表中保持2个ts,这样算下来,延迟是2秒。 这种低延迟的设置,有两个必要的前提:推流时,视频编码的关键帧间隔是1秒一个关键帧,网络延迟低于100毫秒且带宽足够。 可用做内网环境应用,需要自行评估是否能满足流畅度。

播放方式

NodeMediaServer V3版的HLS流同样遵循 /app/stream 资源定位规范,只需要添加.m3u8后缀。 如推流地址: rtmp://server_ip/live/stream

则hls地址为 http://server_ip:8000/live/stream.m3u8

会话型HLS

nginx-rtmp对HLS的实现模式,只是简单的在推流后只生成m3u8和ts文件,并提供http的静态文件服务。无法进行会话管理,无法统计hls播放量,无法获得播放和结束的事件。 NodeMediaServer V3的HLS实现,采用了session会话管理,可以定位访问资源的用户id,ip,访问参数,可以触发事件接口,可以使用内置鉴权规则,可以统计播放量,可以统计用户使用的流量,可以获得用户开始播放和结束播放的事件。

H265/HEVC 编码的 HLS流

NodeMediaServer支持H265/HEVC编码的视频输出HLS流,m3u8采用v7,视频采用fMP4切片。 注意,只有MacOS 10.13,iOS 11之后支持,所有chrome,firefox不支持。Windows下,ie11,edge12-18在硬件支持的情况下支持。部分手机内置浏览器支持(小米)。 具体分析请看:浏览器播放H265/HEVC视频的可行性分析