本发明属于视频直播录制技术领域,具体涉及一种基于hls协议的直播录制方法。
背景技术:
hls协议(httplivestreaming,基于http的自适应码率流媒体传输协议)通常以m3u8作为封装格式,m3u8只是一个描述性的文件,真正的文件流是其内部声明的ts(transportstream,传送流)文件(ts也是一种常用的视频封装格式,加密都是对该文件进行加密,ts只是一种封装格式,也有其他格式,比如mp4)。
现有技术中,普通的hls直播录制如果采用录屏方式容易造成画质降低、增加客户端资源消耗、无法过滤由于断流产生的黑屏等情况。而专业的hls直播录制服务或机器太过于庞大且复杂,对服务端硬件要求较高且并发录制数量往往不高。
技术实现要素:
本发明要解决的技术问题是提供一种基于hls协议的直播录制方法。
为解决上述技术问题,本发明采用如下的技术方案:
本发明实施例提供了一种基于hls协议的直播录制方法,包括以下步骤:预设置步骤,定义录制过程中的参数;
直播源请求步骤,轮询请求直播源的m3u8文件,获取其内容进入直播源解析步骤,终止轮询代表直播结束;
直播源解析步骤,解析直播源的m3u8文件内容,计算出当前直播切片的序号、时间点,结合预设置步骤中定义的更新方式、结束方式及最后直播标识,来判断m3u8文件中是否有新生成的切片、是否已经直播结束,从而触发后续分支逻辑;
内容下载步骤,当直播源解析步骤中发现有新生成的切片时触发,基于切片地址进行切片下载,再结合预设置步骤中定义的存储地址,将切片保存至本地硬盘中;
组装录制文件步骤,在内容下载后执行,当直播切片下载完成后需要将该切片信息记录在录制的视频信息中,录制的视频信息也是一个m3u8文件,如果是直播的第一个切片需要新建该文件,如果m3u8文件已存在,需要向该文件中添加一条切片文件记录信息;同时需要向最后直播标识中记录一下该直播源最后解析的切片信息;
最后直播标识步骤,记录当前录制系统中每个直播源最后解析的切片信息,包括切片的序号或切片的绝对时间,便于下次直播源解析进行判断是否更新;
结束步骤,直播源解析步骤中发现直播已经结束所触发的逻辑,用于将本次录制的m3u8文件追加一个结束标识符,表明该文件已录制完成。
优选地,预设置步骤中,参数包括轮询直播源请求的时间间隔、判断直播源是否更新的方式、判断直播源是否结束的方式和录制的文件存储路径。
优选地,轮询直播源请求的时间间隔与直播源m3u8文件中定义的最大切片时长相同。
优选地,判断hls直播源是否更新的方式包括以切片序号为标识和以切片时间为标识。
优选地,定义判断hls直播源是否结束的方式包括以多久没有更新代表直播停止和以hls直播源包含结束标识代表直播停止。
优选地,直播源解析步骤具体工作过程如下:
直播源解析步骤接收到直播源请求模块转发的hls直播源内容后,进行逐行解析,筛选出切片信息,包括每个切片的序号、每个切片的时间、每个切片的名称和hls直播源结束标识;
解析完以上信息后,首先获取到预设置模块定义的判断hls直播源是否更新的方式:
如果是以切片序号为标识,那么从最后直播标识中获取到该hls直播源最后一次的更新序号,对比数值大小,只要该切片序号比最后一次更新的序号大就认为是新切片,转交至内容下载步骤处理;
如果是以切片时间为标识,那么从最后直播标识中获取到该hls直播源最后一次的更新时间,对比时间早晚,只要该切片时间比最后一次更新的时间晚就认为是新切片,转交至内容下载步骤处理;
如果以上两种情况均判定为旧切片,那么需要获取预设置步骤中定义的判断hls直播源是否结束的方式:如果以多久没有更新代表直播停止,那么需要判定上次更新时间距离当前时间是否超过该值,如果超过需要转交结束步骤处理;如果以hls直播源包含结束标识代表直播停止,那么需要判断直播源内容中是否包含hls直播源结束标识,如果包含需要转交至结束步骤处理;以上条件均不满足直接进行下一轮直播源请求继续监测。
优选地,内容下载步骤具体过程如下:
接收到直播源解析模块转发的切片信息后,需要先判断本次切片的请求方式再进行下载:
如果是绝对路径,直接使用切片名称下载即可;
如果是相对路径,需要根据hls直播源地址生成切片下载地址;
拿到待下载的切片地址后,再获取预设置步骤中定义的存储路径,进行下载、写入即可,下载时可以增加重试逻辑用于保障文件完整性,最后将本次写入的切片信息及路径信息转发至组装录制文件步骤。
采用本发明具有如下的有益效果:
(1)可以对hls直播进行原生无损画面的录制;
(2)由于是对切片进行录制,因此可以自动过滤由于直播信源中断产生的黑屏(信源中断时,通常不会产生新的切片);
(3)支持智能跟随直播停止同步停止录制;
(4)适用于多场景下的直播录制;
(5)在保证录制稳定性的情况下支持较高(4核8g百兆带宽的普通服务器支持600路1080p直播录制)的单机并发数。
附图说明
图1为本发明实施例的基于hls协议的直播录制方法的步骤流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例是基于hls协议的直播源,因此需要先了解hls直播源的部分格式规范,hls协议一般以m3u8为后缀,m3u8文件仅为描述文件,真正直播流内容一般是以ts作为封装格式,每个ts文件又称为切片,范例如下,本发明具体实施方式中的部分说明均以此范例为准。
直播源地址范例:
http://static.danghongyun.com/demo.m3u8
直播源内容:
#extm3u
#ext-x-version:3
#ext-x-targetduration:3
#ext-x-media-sequence:1086
#ext-x-program-date-time:2021-01-09t12:31:16z
#extinf:5.000,
testa.ts
#ext-x-program-date-time:2021-01-09t12:31:21z
#extinf:5.000,
testb.ts
#ext-x-program-date-time:2021-01-09t12:31:26z
#extinf:5.000,
testc.ts
#ext-x-endlist
其中需要重点关注的有:
#ext-x-targetduration:每个切片的最大时长,实际切片可以超过该时长,但是不允许超过2倍该时长。
#ext-x-media-sequence:该直播源中第一个切片的序号,每个ts文件在m3u8文件中都有固定唯一的序列号。
#ext-x-program-date-time:每个切片的绝对时间。
#extinf:每个切片的实际时长。
#ext-x-endlist:如果包含此标识,代表该hls直播源已结束。
参照图1,所示本发明实施例的基于hls协议的直播录制方法的步骤流程图,包括以下步骤:
预设置步骤,定义录制过程中的参数;其中参数主要包含轮询直播源请求的时间间隔、判断直播源是否更新的方式、判断直播源是否结束的方式、录制的文件存储路径,提取这些参数作为设置参数是为了满足不同的直播录制场景,比如7x24小时的长直播录制、2小时的事件型直播等场景下对更新方式、结束方式等要求不同,具体在实施方式中将予以详细说明。
直播源请求步骤,轮询请求直播源的m3u8文件,获取其内容进入直播源解析步骤,终止轮询代表直播结束;轮询请求的原因是因为m3u8文件是随着时间推进而不断更新的,可以在预设置步骤中设置轮询的时间间隔,即每隔多久去请求一次直播源的m3u8文件。根据预设置定义的轮询间隔,对hls直播源进行轮询请求,比如范例中的请求地址为http://static.danghongyun.com/demo.m3u8,将该请求响应的内容后转发至直播源解析模块,同时携带hls直播源地址。
直播源解析步骤,解析直播源的m3u8文件内容,计算出当前直播切片的序号、时间点,结合预设置步骤中定义的更新方式、结束方式及最后直播标识,来判断m3u8文件中是否有新生成的切片(ts文件)、是否已经直播结束,从而触发后续分支逻辑;
内容下载步骤,当直播源解析步骤中发现有新生成的切片时触发,基于切片地址进行切片下载,再结合预设置步骤中定义的存储地址,将切片保存至本地硬盘中;
组装录制文件步骤,在内容下载后执行,当直播切片下载完成后需要将该切片信息记录在录制的视频信息中,录制的视频信息也是一个m3u8文件,如果是直播的第一个切片需要新建该文件,如果m3u8文件已存在,需要向该文件中添加一条切片文件记录信息;同时需要向最后直播标识中记录一下该直播源最后解析的切片信息;
最后直播标识步骤,记录当前录制系统中每个直播源最后解析的切片信息,包括切片的序号或切片的绝对时间,便于下次直播源解析进行判断是否更新;存储切片信息的同时需要关联对应的直播源,因为不同的直播源最后直播标识不同,在直播源解析模块获取的时候便于查找。
结束步骤,直播源解析步骤中发现直播已经结束所触发的逻辑,用于将本次录制的m3u8文件追加一个结束标识符,表明该文件已录制完成,可以对外进行发布播放。
通过以上基于hls协议的直播录制方法可以对hls直播进行原生画面的录制,且支持智能跟随直播停止同步停止录制,同时在保证录制稳定性的情况下支持较高(4核8g百兆带宽的普通服务器支持600路1080p直播录制)的单机并发数。在实际应用实例中,以上步骤可以均包含在录制装置中,无需分开安装部署。
具体应用实例中,预设置模块中完成以下设置及定义:
(1)轮询直播源请求的时间间隔,该间隔会影响录制文件的完整性,建议跟随直播源m3u8文件中定义的最大切片时长,比如范例中的m3u8文件中#ext-x-targetduration为3秒,那么该轮询时间间隔应在3秒左右。
(2)定义判断hls直播源是否更新的方式,包括以切片序号为标识和以切片时间为标识,该两种选择适应的业务场景不同,具体如下:
a.以切片序号为标识即以hls直播源中的#ext-x-media-sequence属性作为当前hls直播源的最后一次更新标识,适用于7×24小时的hls直播源,因为长直播型的hls直播源中的序号比较稳定,不会突然归零导致录制异常;
b.以切片时间为标识即以hls直播源中的#ext-x-program-date-time属性作为当前hls直播源的最后一次更新标识,适用于短时间的事件型的直播源,因为事件型直播的启停操作较为频繁,切片序号不稳定,以时间为标识较为精准。
(3)定义判断hls直播源是否结束的方式包括以多久没有更新代表直播停止和以hls直播源包含结束标识,其中以多久没有更新代表直播停止适用于7x24小时直播,以hls直播源包含结束标识(#ext-x-endlist)代表直播停止适用于事件型直播。
(4)定义录制存储的路径,供内容下载步骤中写入文件使用。
具体应用实例中,直播源解析步骤接收到直播源请求模块转发的hls直播源内容后,进行逐行解析,筛选出切片信息,如下:
每个切片的序号:由hls直播源中的#ext-x-media-sequenc属性值 本次hls直播源中的切片顺序(从0开始),举例如下:
直播源内容:
#extm3u
#ext-x-version:3
#ext-x-targetduration:3
#ext-x-media-sequence:1086
#ext-x-program-date-time:2021-01-09t12:31:16z
#extinf:5.000,
testa.ts
#ext-x-program-date-time:2021-01-09t12:31:21z
#extinf:5.000,
testb.ts
#ext-x-program-date-time:2021-01-09t12:31:26z
#extinf:5.000,
testc.ts
其中每个切片的序号计算方式:
testa.ts:1086 0=1086
testb.ts:1086 1=1087
testc.ts:1086 2=1088
每个切片的时间:#ext-x-program-date-time属性值;
每个切片的名称:testa.ts、testb.ts、testc.ts,此处举例的切片为相对路径,也有绝对路径方式即http全路径,交由内容下载步骤进行适配;
hls直播源结束标识用于解析是否含有#ext-x-endlist标识;
解析完以上信息后,首先获取到预设置模块定义的判断hls直播源是否更新的方式:
如果是以切片序号为标识,那么从最后直播标识中获取到该hls直播源最后一次的更新序号,对比数值大小,只要该切片序号比最后一次更新的序号大就认为是新切片,转交至内容下载步骤处理;
如果是以切片时间为标识,那么从最后直播标识中获取到该hls直播源最后一次的更新时间,对比时间早晚,只要该切片时间比最后一次更新的时间晚就认为是新切片,转交至内容下载步骤处理;
如果以上两种情况均判定为旧切片,那么需要获取预设置步骤中定义的判断hls直播源是否结束的方式:
如果以多久没有更新代表直播停止,那么需要判定上次更新时间距离当前时间是否超过该值,如果超过需要转交结束步骤处理;如果以hls直播源包含结束标识(#ext-x-endlist)代表直播停止,那么需要判断直播源内容中是否包含hls直播源结束标识,如果包含需要转交至结束步骤处理;以上条件均不满足直接进行下一轮直播源请求继续监测。
具体应用实例中,内容下载步骤中,接收到直播源解析模块转发的切片信息后,需要先判断本次切片的请求方式再进行下载:
如果是绝对路径,直接使用切片名称下载即可;
如果是相对路径,需要根据hls直播源地址生成切片下载地址,例:直播源为http://static.danghongyun.com/demo.m3u8、切片为testa.ts,那么切片的地址为http://static.danghongyun.com/testa.ts,即将m3u8文件名称换成切片名称;
拿到待下载的切片地址后,再获取预设置步骤中定义的存储路径,进行下载、写入即可,下载时可以增加重试逻辑用于保障文件完整性,最后将本次写入的切片信息及路径信息转发至组装录制文件步骤。
具体应用实例中,组装录制文件步骤中,录制的文件内容参考m3u8规范,在整个录制过程中都处于更新的状态,由内容下载步骤触发,接收到内容下载步骤传递的切片信息后,需要先在预设置步骤定义的存储路径中检查是否存在录制后的m3u8文件;
如果是直播的第一个切片需要在该存储路径下写入一个全新的m3u8文件,按照m3u8规范即可,文件名称根据业务而定,此处举例为vod.m3u8,不作为本发明的限制条件,内容如下:
#extm3u
#ext-x-version:3
#ext-x-targetduration:5
然后后续再更新此m3u8,追加接收到的切片信息,追加后如下:
#extm3u
#ext-x-version:3
#ext-x-targetduration:5
#extinf:5.000,
testa-new.ts
其中:
#extinf:为下载模块传递的切片时长;
testa-new.ts为下载模块写入到存储上的文件名称,更新完成后将此切片信息记录至最后直播标识中,然后进行下一轮直播源请求。
具体应用实例中,结束步骤中,当直播源解析模块判定为结束时执行,需要对组装录制文件模块更新的m3u8进行追加结束标识用来转换为m3u8点播文件,追加后的文件内容为:
#extm3u
#ext-x-version:3
#ext-x-targetduration:5
#extinf:5.000,
testa-new.ts
#ext-x-endlist
至此,该hls直播源的收录已结束,产生的录制文件为vod.m3u8,提供对外发布访问即可。
应当理解,本文所述的示例性实施例是说明性的而非限制性的。尽管结合附图描述了本发明的一个或多个实施例,本领域普通技术人员应当理解,在不脱离通过所附权利要求所限定的本发明的精神和范围的情况下,可以做出各种形式和细节的改变。
1.一种基于hls协议的直播录制方法,其特征在于,包括以下步骤:
预设置步骤,定义录制过程中的参数;
直播源请求步骤,轮询请求直播源的m3u8文件,获取其内容进入直播源解析步骤,终止轮询代表直播结束;
直播源解析步骤,解析直播源的m3u8文件内容,计算出当前直播切片的序号、时间点,结合预设置步骤中定义的更新方式、结束方式及最后直播标识,来判断m3u8文件中是否有新生成的切片、是否已经直播结束,从而触发后续分支逻辑;
内容下载步骤,当直播源解析步骤中发现有新生成的切片时触发,基于切片地址进行切片下载,再结合预设置步骤中定义的存储地址,将切片保存至本地硬盘中;
组装录制文件步骤,在内容下载后执行,当直播切片下载完成后需要将该切片信息记录在录制的视频信息中,录制的视频信息也是一个m3u8文件,如果是直播的第一个切片需要新建该文件,如果m3u8文件已存在,需要向该文件中添加一条切片文件记录信息;同时需要向最后直播标识中记录一下该直播源最后解析的切片信息;
最后直播标识步骤,记录当前录制系统中每个直播源最后解析的切片信息,包括切片的序号或切片的绝对时间,便于下次直播源解析进行判断是否更新;
结束步骤,直播源解析步骤中发现直播已经结束所触发的逻辑,用于将本次录制的m3u8文件追加一个结束标识符,表明该文件已录制完成。
2.如权利要求1所述的基于hls协议的直播录制方法,其特征在于,预设置步骤中,参数包括轮询直播源请求的时间间隔、判断直播源是否更新的方式、判断直播源是否结束的方式和录制的文件存储路径。
3.如权利要求2所述的基于hls协议的直播录制方法,其特征在于,轮询直播源请求的时间间隔与直播源m3u8文件中定义的最大切片时长相同。
4.如权利要求2所述的基于hls协议的直播录制方法,其特征在于,判断hls直播源是否更新的方式包括以切片序号为标识和以切片时间为标识。
5.如权利要求2所述的基于hls协议的直播录制方法,其特征在于,定义判断hls直播源是否结束的方式包括以多久没有更新代表直播停止和以hls直播源包含结束标识代表直播停止。
6.如权利要求1所述的基于hls协议的直播录制方法,其特征在于,直播源解析步骤具体工作过程如下:
直播源解析步骤接收到直播源请求模块转发的hls直播源内容后,进行逐行解析,筛选出切片信息,包括每个切片的序号、每个切片的时间、每个切片的名称和hls直播源结束标识;
解析完以上信息后,首先获取到预设置模块定义的判断hls直播源是否更新的方式:
如果是以切片序号为标识,那么从最后直播标识中获取到该hls直播源最后一次的更新序号,对比数值大小,只要该切片序号比最后一次更新的序号大就认为是新切片,转交至内容下载步骤处理;
如果是以切片时间为标识,那么从最后直播标识中获取到该hls直播源最后一次的更新时间,对比时间早晚,只要该切片时间比最后一次更新的时间晚就认为是新切片,转交至内容下载步骤处理;
如果以上两种情况均判定为旧切片,那么需要获取预设置步骤中定义的判断hls直播源是否结束的方式:如果以多久没有更新代表直播停止,那么需要判定上次更新时间距离当前时间是否超过该值,如果超过需要转交结束步骤处理;如果以hls直播源包含结束标识代表直播停止,那么需要判断直播源内容中是否包含hls直播源结束标识,如果包含需要转交至结束步骤处理;以上条件均不满足直接进行下一轮直播源请求继续监测。
7.如权利要求1所述的基于hls协议的直播录制方法,其特征在于,内容下载步骤具体过程如下:
接收到直播源解析模块转发的切片信息后,需要先判断本次切片的请求方式再进行下载:
如果是绝对路径,直接使用切片名称下载即可;
如果是相对路径,需要根据hls直播源地址生成切片下载地址;
拿到待下载的切片地址后,再获取预设置步骤中定义的存储路径,进行下载、写入即可,下载时可以增加重试逻辑用于保障文件完整性,最后将本次写入的切片信息及路径信息转发至组装录制文件步骤。
技术总结