一种视频流的拆条和抽帧方法与流程

文档序号:15116825发布日期:2018-08-07 20:34阅读:1577来源:国知局

本发明涉及视频技术领域,尤其涉及一种视频流的拆条和抽帧方法。



背景技术:

httplivestreaming(缩写是hls)是一个基于http的流媒体网络传输协议。它的工作原理是把整个流分成一个个小的基于http的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extendedm3u(m3u8)playlist文件,用于寻找可用的媒体流。

目前现有的视频截图方法包括:

1.通过获取播放页面的根view,调用getdrawingcache()方法获取view的视图缓存,来实现截图的效果;但是该方案在含有surfaceview的页面上会出现问题,surfaceview部分是黑,因为surfaceview并不是在ui线程中渲染的,所以无法得到相关视图。

2.通过调用系统隐藏的api来实现截图的效果;这种截图方式的基本原理是通过framebuffer来实现的,framebuffer是linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由framebuffer设备驱动来完成的。然而,这种方式需要添加android.permission.read_frame_buffer权限,而这个权限的正常执行需要系统权限。因此这种方式只能应用于系统级app中。



技术实现要素:

鉴于上述的分析,本发明旨在提供一种视频流的拆条和抽帧方法,解决视频截取和视频截图中出现的问题,实现短视频和视频截图的分享。

本发明的目的主要是通过以下技术方案实现的:

一种视频流的拆条和抽帧方法,包括以下步骤:

步骤s1、获取视频流的原始m3u8文件地址,下载原始m3u8文件并判断是否存在嵌套,是,则解析出二级m3u8文件地址,下载包含ts片信息的二级m3u8文件;否,则直接下载包含ts片信息的原始m3u8文件;

步骤s2、根据获取的包含ts片信息的m3u8文件,按照ts片信息将视频分成ts片进行下载或播放;

步骤s3、在下载或播放过程中,不断获得并更新ts片列表,并判断是否有拆条或抽帧指令;如果有拆条指令,则进入步骤s4;如果有抽帧指令,则进入步骤s5;

步骤s4、解析拆条指令,定位并提取拆条视频对应的ts列表,重新组成一个新的m3u8文件,供用户使用或分享;

步骤s5、解析抽帧指令,定位图像帧位于所在ts片的时间点,对图像帧进行抽取,得到图像,供用户使用或分享。

进一步地,判断下载的原始m3u8文件的字符流中,是否包含“ext-x-stream-inf”标签,是,则原始m3u8文件存在嵌套,该原始m3u8文件为一级m3u8文件,包含二级m3u8文件,否,则原始m3u8文件不存在嵌套。

通过标签可对原始m3u8文件是否存在嵌套进行判断。

进一步地,所述二级m3u8文件的地址包含在“ext-x-stream-inf”标签下对应的描述信息中。

以便于提取二级m3u8文件的地址。

进一步地,所述二级m3u8文件的地址分为绝对地址和相对地址;以http开头的为绝对地址;以“/”开头的为根路径的相对地址,其余情况为m3u8文件路径的同级相对地址。

通过绝对地址或相对地址,能够正确下载二级m3u8文件。

进一步地,直接访问所述绝对地址,对所述相对地址的访问需要补全前缀地址。

进一步地,步骤s4包括以下子步骤:

步骤s401、解析拆条指令,得到拆条的起始时间和停止时间,根据拆条的起始时间在ts片列表中定位起始时间对应的ts片,作为新m3u8文件的起始ts片;

步骤s402、根据拆条的停止时间,在ts片列表中定位停止时间对应的ts片,作为新m3u8文件的停止ts片;

步骤s403、提取起始ts片和停止ts片之间的ts列表构成一个新的m3u8文件,得到拆条视频,供用户使用或分享。

本步骤的拆条方法实现了快速、有效、耗时低的视频拆条;不需要对源视频进行重新切片处理,可以做成自动化的程序系统,实现大量视频的工厂化处理。

进一步地,如果拆条的起始时间和停止时间的时间差小于起始时间对应ts片的时间长度,则新m3u8文件的起始ts片和停止ts片为同一个ts片,新m3u8文件中只有一个ts片。

进一步地,步骤s5包括以下子步骤:

步骤s501、解析抽帧指令,得到抽取图像帧的时间点t0,并定位到图像帧所在的目标ts片;

步骤s502、在目标ts片中定位抽取图像帧的时间点,用时间点t0减去目标ts片之前的累加时间t1得到tx,所述tx即为抽取图像帧在目标ts片中的相对时间点;

步骤s503、根据相对时间点tx,利用mediaplayer缓存和解码目标ts片媒体流数据,进行抽帧得到最终的帧图像,供用户使用或分享。

本步骤的抽帧方法实现了,不需要对视频进行图像分析即可实现关键帧的抽取;实现一个视频中任意时间点的抽帧;避免应用层进行抽帧带来的黑屏问题。

进一步地,所述目标ts片确定步骤包括:

首先,依次累加ts片时间得到时间t1,并得到下一个ts的时间长度t2;

其次,判断是否满足t1<t0<t1+t2,如果满足,那么,t2对应的这个ts片就是我们需要的目标ts片。

进一步地,所述拆条和抽帧方法支持目前流行的视频编码和音频编码方式,所述视频流编码为h.264,音频流编码为aac。

本发明有益效果如下:

通过下载m3u8文件实现了ts片信息的下载,通过将视频分成ts片实现了视频的播放或下载;

对视频进行拆条将直播节目、点播节目拆分为单独的视频发布,极大的提高直播节目的重复利用,增加用户的观看量;

所述拆条实现了快速、有效、耗时低的视频拆条;不需要对源视频进行重新切片处理,可以做成自动化的程序系统,实现大量视频的工厂化处理;

对视频进行抽帧,得到用户需要的截图后,通过微信等社交平台分享给好友,提升观看节目的体验;

采用本发明方法对视频进行抽帧时,避免了黑屏问题的出现;

抽帧操作不需要系统权限,增加了抽帧方法的通用性和方法移植的适应性。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为完整的m3u8的结构图;

图2为视频流的拆条和抽帧方法流程图。

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理。

本发明的一个具体实施例,公开了一种视频流的拆条和抽帧方法;

该方法基于hls协议,可以在普通的http中提供点播和直播,该技术基本原理是将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。支持的视频流编码为h.264,音频流编码为aac。hls的传输内容包含2部分,一是m3u8描述文件,二是ts媒体文件,m3u8描述文件和ts媒体文件,互相独立,m3u8文件中记录了多个ts媒体文件的信息。一个m3u8索引文件就是一个由多个独立行组成的文本文件,每行由回车/区分;每一行可以是一个uri空白行或是以“#”号开头的字符串,并且空格只能存在于一行中不同元素间的分隔,以“#ext”开头的表示一个标签,否则表示注释,直接忽略。一个uri表示一个媒体段或是“variantplaylistfile”,最多支持一层嵌套,包括两级m3u8文件,即一级m3u8文件中嵌套另一个二级m3u8文件;当包含嵌套二级m3u8文件时,一级m3u8文件含有“ext-x-stream-inf”标签,不包含嵌套二级m3u8文件时,原始m3u8文件不含有“ext-x-stream-inf”标签。

在hls协议下,一段完整的视频被切成了很多时间很短的视频段,即ts片,例如可以是5s一个片段,这些片段通过m3u8文件来组成一个描述文件,主要描述了所有的片段的起止时间点和播放路径,并把这些ts片串联起来,这样播放器在拿到这个索引文件后可以按照索引去实时播放了,即按照索引文件的描述一条一条的取出来播放。一个完整的m3u8的结构,如图1所示。

具体的实施方式,如图2所示,包括以下步骤:

步骤s1、获取视频流的原始m3u8地址,下载原始m3u8文件;对下载的原始m3u8文件进行嵌套判断,是,则解析出二级m3u8文件地址,下载包含ts片信息的二级m3u8文件;否,则直接下载包含ts片信息的原始m3u8文件;

读取下载的原始m3u8文件的字符流,寻找是否包含“ext-x-stream-inf”标签,如果包含,判断原始m3u8文件存在嵌套,该原始m3u8文件为一级m3u8文件,包含二级m3u8文件,读取“ext-x-stream-inf”标签下对应的描述信息,得到二级m3u8文件的地址;根据得到二级m3u8文件的地址下载包含ts片信息的二级m3u8文件;

所述地址分为绝对地址和相对地址,具体地,以http开头的为绝对地址;以“/”开头的为根路径的相对地址;其余情况为m3u8文件路径的同级相对地址;所述绝对地址可以直接访问,所述相对地址需要补全前缀地址才可以访问。

步骤s2、根据获取的包含ts片信息的m3u8文件,按照ts片信息将视频分成ts片进行下载、播放或边下载边播放;

步骤s3、在下载或播放过程中,不断获得并更新ts片列表,并判断视频用户是否有拆条或抽帧需求?如果接收到拆条指令,则进入步骤s4;如果接收到抽帧指令,则进入步骤s5;

步骤s4、解析拆条指令,定位并提取拆条视频对应的ts列表,重新组成一个新的m3u8文件,供用户使用或分享;

具体包括以下子步骤:

步骤s401、解析拆条指令,得到拆条的起始时间和停止时间,根据拆条的起始时间在ts片列表中定位起始时间对应的ts片,作为新m3u8文件的起始ts片;

步骤s402、根据拆条的停止时间,在ts片列表中定位停止时间对应的ts片,作为新m3u8文件的停止ts片,如果拆条的起始时间和停止时间的时间差小于起始时间对应ts片的时间长度,则新m3u8文件的起始ts片和停止ts片为同一个ts片;

步骤s403、提取起始ts片和停止ts片之间的ts列表构成一个新的m3u8文件;如果起始ts片和停止ts片为同一个ts片,则新m3u8文件中只有一个ts片。

本步骤的拆条方法实现了快速、有效、耗时低的视频拆条;不需要对源视频进行重新切片处理,可以做成自动化的程序系统,实现大量视频的工厂化处理。

步骤s5、解析抽帧指令,定位图像帧所在的ts片,再定位图像帧位于所在ts片的时间点,对图像帧进行抽取,得到最终的抽取帧的图像,供用户使用或分享;

具体包括以下子步骤:

步骤s501、解析抽帧指令,得到抽取图像帧的时间点t0,并定位到图像帧所在的ts片;

首先,依次累加ts片时间得到时间t1,并得到下一个ts的时间长度t2;

其次,判断是否满足t1<t0<t1+t2,如果满足,那么,t2对应的这个ts片就是我们需要的目标ts片;

步骤s502、在目标ts片中定位抽取图像帧的时间点,用时间点t0减去累加时间t1得到tx,所述tx即为抽取图像帧在目标ts片中的相对时间点,

步骤s503、根据相对时间点tx,对利用mediaplayer缓存和解码目标ts片媒体流数据,进行抽帧得到最终的帧图像。

本步骤的抽帧方法实现了,不需要对视频进行图像分析即可实现关键帧的抽取;实现一个视频中任意时间点的抽帧;避免应用层进行抽帧带来的黑屏问题。

综上所述,本实施例所公开的视频流的拆条和抽帧方法,通过下载m3u8文件实现了ts片信息的下载,通过将视频分成ts片实现了视频的播放或下载;

对视频进行拆条将直播节目、点播节目拆分为单独的视频发布,极大的提高直播节目的重复利用,增加用户的观看量;

对视频进行抽帧,得到用户需要的截图后,通过微信等社交平台分享给好友,提升观看节目的体验;

采用本发明方法对视频进行抽帧时,避免了黑屏问题的出现;

抽帧操作不需要系统权限,增加了抽帧方法的通用性和方法移植的适应性。

本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1