本发明涉及流媒体领域,更为具体来说,尤其涉及一种流媒体的播放方法。
背景技术:
随着互联网流媒体业务需求的不断增多,流媒体现在已经进入千家成万户,用户对于流媒体的时移回看需求也日益增长,现有的流媒体直播、时移、回看方案已经不能满足用户的需求。
一方面,现有的时移方案在查找帧方面要么是逐帧查找并以帧为单位发送,要么是逐帧查找并以GOP的为单位发送,查找效率低下。现有的存储方案在收到相关录制文件的命令时,就开始录相,录相的大小是每隔10分钟(这个大小可以配置)分割一个文件,其文件名字可以是任意的。现有的回看方案在查找要发送的文件及定位要发送起始位置方面没有一个良好的解决方案,其定位文件的办法是以文件的创建时间时行查找的,而查找要发送的位置是对文件进行解析后确定要发送的位置。
另一方面,根据网络状况对多码流的支持(超清、高清、普清、流畅)遇到了瓶颈,比如:对hls的直播、回看的支持现在也遇到了瓶颈,现有的hls的解决方案是切片成ts后,通过传统的http服务器去下载文件,ts切片的时间越短直播时的实时性就越好,但是当并发量上来后,服务器的资源消耗是很高的(这里的资源包括文件IO的使用等),现在流媒体行内还没有找到类似的解决方案。
技术实现要素:
本发明针对传统流媒体播放方案存在的查找回看文件效率低、服务器的资源消耗高等问题,提供了一种流媒体播放方法,达到提高查找回看文件效率、降低服务器资源消耗等技术目的。
本发明解决上述技术问题的技术方案如下:
一种流媒体的播放方法,该方法的步骤包括:
步骤S1,对播放的数据文件进行存储以及查找;
步骤S2,对所述步骤S1的存储的文件进行目录创建操作;
步骤S3,将所述步骤S2中的存储的文件存储到缓存中;
步骤S4,对所述步骤S3中的缓存的文件进行回看播放。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述步骤S1中,其步骤包括:
步骤S11,定义循环数组来存放每一组连续的画面(GOP),存储GOP的数据结构是由先定义的抽象帧的结构和循环数组中元素的结构组成;
步骤S12,把解析完完整的一帧数据按以GOP为单位存储在循环数组中;
步骤S13,若是直播请求查找,直接取最新更新的GOP发送到请求直播数据的程序中;若是时移请求,则要查找时移的发送点,发送点是根据时移时间与现在缓存数组中的最早时间的做差,然后在循环数组中直接定位时移的发送点。
采用上述进一步方案的有益效果是:节省了查找时间,存储方便,存储效率提高,节省存储空间,将直播及时移的数据缓存在内存中,当有直播请求时,直接从内存中发送数据,提高系统性能,较少占用文件的IO。
进一步,所述步骤S2中创建目录操作还包括:创建目录规则,主机名-文件目录-存储文件的日期;文件目录的命名规则,命名规则是按照年、月、日、小时、分钟、秒共14位,若月日时分秒不足两位的在左边用零补够,若文件切片存储时长为x,则文件名的命令规则为x的整数倍。
采用上述进一步方案的有益效果是:方便了查找和管理,保证系统的所有流创建的目录不会重复,提高查找效率。
进一步,所述步骤S3中还包括切片流程,该切片流程的步骤为:
步骤S31,在程序中读取磁盘的块的大小,定义缓存大小为块的大小的整数倍;
步骤S32,当接收到已经解析帧数据时,先判断是否要创建新文件,即判断是否当前帧为关键帧并且帧数据的时间已经大于存储时长,若创建,则执行步骤S33,若不创建,则执行步骤S34;
步骤S33,判断缓存中的数据是否有写入磁盘中的数据,若有,则先写入切片文件中再关闭旧文件并创建新文件,若没有,则直接创建新文件;
步骤S34,判断缓存区是否满,若没有空间,则先把缓存内容即帧数据写入磁盘,再把帧数据复制到缓存,若有空间,则把缓存内容即帧数据直接写进缓存区。
有益效果:在发送数量大的情况下,可以很好的利用文件控制模块,很快的把视频文件存储在硬盘上。
进一步,所述步骤S3中还包括:切片索引数据算法,根据文件时长每秒存储一个关键帧索引结构,结构中存储关键帧的播放时间、在文件中的位置、是否为该秒内的关键帧;切片的异常处理,若本存储服务器上的切片不完整时,删除本服务器上不完整的切片,并向网中其他的相同的节点发送查找命令,若其他服务器上有完整的切片则下载该切片,下载文件采用断点续传的方法,若没有,则记录在异常日志中,并以电邮的形式返给运维人员。
采用上述进一步方案的有益效果是:保证不同的机子上的相同的程序所做的切片的大小及名字是一样的,便于处理由网络及其他的因素引起的切片异常。
进一步,所述回看播放流程:步骤S41,收到回看的请求,根据开始时间查找回看的第一个文件;
步骤S42,判断是否找到符合回看播放时间要求的切片文件,若找到,则执行步骤S44,否则执行步骤S43;
步骤S43,切片文件没有找到,返回错误码;
步骤S44,发送切片文件,成功发送切片文件后执行步骤S45,否则执行纪步骤S43;
步骤S45,判断有没有end参数,若有,则执行步骤S47,否则,执行步骤S46;
步骤S46,先生成下一个文件名,其文件名是代表时间的字符串,然后查找下一个切片文件,执行步骤S42;
步骤S47,先生成下一个文件名,其文件名是代表时间的字符串,并根据文件名字代表的时间判断是否大于end参数,若大于执行步骤S48,否则执行步骤S46;
步骤S48,结束回看流程。
本发明的有益效果是:在数据大量发送的情况下,可以实时的响应用户的需要,另外由于步骤中的查找方法是绝对路径直接判断是否文件存在,存在则为找到,不存在则没有找到,这样大大提高了查找文件的效率。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述的流媒体的播放方法是基于非多码率协议的或基于多码率协议的。
进一步,基于多码率协议的流媒体在所述步骤S12中增加一层hls文件逻辑切片层,解析完完整的一个逻辑切片后,按照逻辑切片为单位存储在循环数组中,在请求切片文件时,则要查找逻辑切片的位置。
进一步,基于多码率协议的循环数组是虚拟切片的信息,数组中的大小为切片的个数,以及增加了m3u8格式文件,其中直播是直接读取内存中的m3u8格式文件,而时移是先查找逻辑切片,再生成m3u8格式文件。
进一步,基于多码率回看的存储方式为切片存储。
进一步,所述回看的流程步骤:基于多码率协议的回看的流程步骤为:
步骤1,收到请求回看m3u8格式文件的请求,判断有无end参数,若有end参数,执行步骤2,若没有,则给end参数赋予当前的时间值,然后执行步骤2;
步骤2,组成m3u8格式文件,判断是否生成正确的m3u8格式文件内容,若是,则执行步骤3,若否,则直接返回;
步骤3,发送m3u8格式文件后返回。
上述所有的关于多码率的步骤和逻辑结构方法都同样适用于hls、hds和dash。
本发明的有益效果是:可以提高流媒体流直播、切片存储、查找切片回看部分的性能有很大的提高,在改善商业流媒体模块部分有很高的参考价值。
本发明附加的方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明实践了解到。
附图说明
图1为本发明流媒体的播放方法流程图。
图2为本发明所述的切片流程图。
图3为本发明所述流媒体的回看的流程图。
图4为本发明所述的请求m3u8格式文件的具体流程。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
下面是对本系统各部分的仔细分析过程和步骤详解。
实施例1
基于非多码率协议的流媒体的直播、时移
1.对直播、时移帧数据的存储方案
由于时移的数据是存在内存中的,为了便于查找,先定义一个长度为时移时长秒数的循环数组来存放每一组连续的画面(GOP),存储GOP的数据结构由先定义抽像帧的结构和循环数组中元素的结构组成。
为了方便快速查找,在解析也就是按照音频视频压缩打包及封装结构逻辑联合进行解析完后,按照GOP为单位存储在循环数组中(循环数组的大小为时移时长的秒数),若1秒内有多个IDR帧,则只记录该秒内的第一个IDR帧,若1秒内没有IDR帧,则记录它的上一个IDR帧结构,并以一flag标识这个结构是重复上个GOP。
2.直播、时移数据发送点的查找方案
如果是直播请求,直接取最新更新的GOP发送给请求直播数据的程序。
如果是时移请求,则要查找时移的发送点,发送点其算法也比较简单,其做法是:时移时间与现在缓存数组中的最早时间的差,在循环数组中直接定位的时移的发送点。
3.基于非多码率协议的流媒体的存储
创建目录的规则是以每个主机名(www.test.com)/uri(每个分割符是一个目录)/date(存储文件创建日期)。使用date的目的是为了方便查找和管理,当我们要存储的文件要保存很长时间比如:1个月,如果没有date目录,同一目录就会产生好多文件,不利于查询和管理。这样就保证了系统内地所有流创建的目录不会重复。
删除目录的规则是在删除文件时,判断是否有当前目录是否为空,如果为空则删除。
文件的命名及管理规则
如果文件切片存储的文件时长为x,则文件名的命令规则为x的整数倍。说20160408090000、20160408091000/20160408092000等。
文件的删除
判定文件删除的条件是该文件超长了回看时长;删除规则是每次删除一个小时(这个是以10分钟切片时长为标准的一个设定值)的视频文件。
注:有一个专门的线程去存储管理文件及目录的删除工作,以项目中的经验就放在主线程中。
文件的查找
索引文件时可以根据要查找的时间点直接进行定位,提高了查找效率。比如查找的时间是2016-04-08 09:53:00时,我们可以查找文件“20160408095000”是否存在。
4.保证系统运行的切片数
说明:根据回看设置的最大时间、连接空闲时间设置、回看文件的最后修改时间和回看请求的回看开始时间点,系统对部分超过一定时间范围的回看请求认定为非法请求,并进行强制关闭,其条件定义如下:
假设:回看文件最大保留时间T1,连接最大空闲超时时间为T2,回看请求当前发送对应文件的最后修改时间为T3,回看请求的回看开始时间点为T4,当前时间为T,则系统可以确定切片文件在磁盘上的保留数量,超过此数量时会对旧文件进行清理,其条件定义如下:
假设单个切片文件时长为T5,因为T3+T1<T的请求会被认定为非法请求,可得需要保留的最大时间为T5+T1,所以可得需要保留的最大切片数量为(T5+T1+T5-1)/T5。
注:这里的切片时长T5满足条件为:T5远大于系统处理网络较慢的客户端请求所需要的时间,当切片时长不满足需求,可以根据需要自己定义一个可以处理完系统中所有网络较慢的客户端请求。
5.切片流程如图2所示
步骤1,在程序中读取磁盘的块的大小,定义缓存大小为块的大小的整数倍;步骤2,当接收到已经解析帧数据时,先判断是否要创建新文件,若是当前帧为关键帧并且帧数据的时间已经大于存储时长,若创建,则执行步骤3,不创建,则执行步骤4;步骤3,判断缓存中的数据是否有写入磁盘中的数据,若有,则先写入切片文件中再关闭旧文件并创建新文件,若没有,则直接创建新文件;步骤4,判断缓存区是否满,若没有空间,则先把缓存内容即帧数据写入磁盘,再把帧数据复制到缓存,若有空间,则把缓存内容即帧数据直接写进缓存区。其中,缓存的大小为磁盘块的大小的整数倍。
判断是否要创建新文件的条件是判断为当前帧是否为关键帧并且帧数据的时间已经大于存储时长。
注:这个切片方法保证不同的机子上的时间的程序所做的切片的大小及文件名字是一样的,便于处理由网络及其他因素引起的切片异常情况。
6.索引数据的存储
根据文件时长每秒中存储一个关键帧索引结构,该结构中存储的是关键帧的播放时间、在文件中的位置、是否为该秒内的关键帧。具体的存储方案是:支存储GOP内的IDR帧信息,如果1秒内有多个IDR帧,则只记录该秒内的第一个IDR帧,如果帧内没有IDR帧,则记录它的上一个IDR帧结构,并以flag标识这个结构是重复上个GOP。
索引数据的存储有两种模式:一种是和音视频数据存储在一个文件中,这样可以减少系统对文件id的占用;一处是索引数据和音频数据存储在不同的文件中,这样的做法系统占用的文件id会多一些,系统要多一些管理。
7.切片的异常处理
网络异常时,不能保证文件中的切片都完整,为了解决这个异常问题,本发明中提供的方法如下:由于文件的存储方案就能保证不同的机子对相同的流生成相同的切片,所以当本存储服务器上的切片不完整时,删除本服务器上不完整的切片,并向网中其他的节点发送查找命令,如果其他服务上有完整的切片则下载该切片就行,由于网络的不稳定性,下载文件采用断点续传的方法;如果没有则记录一个异常在日志中,并把这个问题以电子邮件的形式返回给运维人员。
8.基于非多码率协议的流媒体的回看
根据请求参数的不同,此功能的算法分为两个部分,一个是带结束时间的回看功能,一个是不带结束时间的回看功能。如图3所示的回看流程图其流程为步骤1,收到回看的请求,根据开始时间查找回看的第一个文件;步骤2,判断是否找到符合回看播放时间要求的切片文件,若找到,则执行步骤4,否则执行步骤3;步骤3,切片文件没有找到,返回错误码;步骤4,发送切片文件,成功发送切片文件后执行步骤5,否则执行纪步骤3;步骤5,判断有没有end参数,若有,则执行步骤7,否则,执行步骤6;步骤6,先生成下一个文件名,其文件名是代表时间的字符串,然后查找下一个切片文件,执行步骤2;步骤7,先生成下一个文件名,其文件名是代表时间的字符串,并根据文件名字代表的时间判断是否大于end参数,若大于执行步骤8,否则执行步骤6;步骤8,结束回看流程。
步骤1和6中查找文件的方法是根据文件绝对路径直接判断是否文件存在,存在则为找到,不存在则没有找到。这样大大提高了查找文件的效率。实施例2
基于多码率的协议的流媒体的直播、时移
基于自适应码率协议的流媒体直播、时移,现在的解决方案是把切片存储在磁盘上,并通过调整切片时长来提高直播的实时性,这个方案的缺点就是切片时长越短,切片文件就越多,造成文件IO的占有率较高,系统性能下降的问题。
本发明中的方法是将直播、时移的数据缓存在内存中,当有直播请求时,直接从内存中发送数据,提高系统性能,减少占用文件IO。在发送数据量大的情况下,可以实时的响应用户的需求。
1.多码率直播、时移切片数据的存储
在基于非多码率协议的流媒体的时移的方案上再增加一层----hls文件逻辑切片层
为了快速查找,在解析完完整的一个逻辑切片后,按照逻辑切片为单位存储在循环数组中,该循环数组中的元素是hls_logic_file_s这个结构。循环数组的大小为配置中的切片个数。请求切片文件时,则要查找逻辑切片的位置,其算法是:根据逻辑文件的文件名字与现在缓存数组中的最早切片的文件名的时间差在循环数组中直接定位所要的切片;M3u8格式文件缓存在m3u8_file格式文件全局数组中,M3u8格式文件包含两部分直播和时移,其中直播和时移是不同的逻辑,直播可以直接读取内存中的m3u8格式文件;时移先查找逻辑切片,再生成m3u8格式文件。
2.多码率回看切片数据的存储
这部分的存储与基于非多码率协议的流媒体的存储部分相同,采用大切片存储。
请求切片的过程是基于http协议的而下载过程,具体可以参考相关http的下载文件的相关知识。这里的算法主要是请求m3u8格式文件的过程,如图4所述如下:
步骤1,收到请求回看m3u8格式文件的请求,判断有无end参数,若有,则end参数,执行步骤2;若没有,则给end参数赋予当前的时间值,然后执行步骤2;步骤2,组成m3u8格式文件,判断是否生成正确的m3u8格式文件内容,若是,则执行步骤3,若否,则直接返回;步骤3,发送m3u8格式文件后返回。
其中查找过程同“基于非多码率协议的流媒体的回看”部分,过程为:步骤1.根据时间查找回看的第一个文件;步骤2.判断是否查找到符合时间要求的切片文件,如果找到执行步骤4,否则执行步骤3;步骤3.切片文件没有找到,返回错误码;步骤4.组成m3u8格式文件,生成m3u8格式文件成功,成功发送后执行步骤6;否则执行步骤3;步骤5.先生成下一个文件名,文件名是代表时间的字符串,查找下一个切片文件,执行步骤2;步骤6.先生成下一个文件名,文件名是代表时间的字符串,并根据文件名字代表的时间判断是否大于end参数,如果大于执行步骤7,否则执行步骤5;步骤7.流程结束。
3.异常处理与非多码率异常处理的过程相同。
本发明的有益效果:可以提高流媒体直播、切片存储、查找切片回看部分的性能有了很大的提高,在改善商业流媒体模块部分有很高的参考价值。
在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、方法、装置或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。