一种媒体文件加载方法、装置及存储介质

文档序号:1784944 发布日期:2019-12-06 浏览:9次 >En<

阅读说明:本技术 一种媒体文件加载方法、装置及存储介质 (Media file loading method and device and storage medium ) 是由 银国徽 于 2018-05-29 设计创作,主要内容包括:本公开提供了一种媒体文件加载方法,包括检测播放器播放媒体文件过程中所到达的播放点;从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;通过所述播放器加载所获取的内容单元。本公开还提供一种媒体文件加载装置及存储介质。(The present disclosure provides a media file loading method, including detecting a playing point reached by a player in a process of playing a media file; acquiring a content unit with playing time behind the playing point from the content units included in the media file; the content unit is obtained by converting and dividing the content based on the media file according to the playing time; loading, by the player, the obtained content unit. The disclosure also provides a media file loading device and a storage medium.)

一种媒体文件加载方法、装置及存储介质

技术领域

本公开涉及媒体播放技术,尤其涉及一种媒体文件加载方法、装置及存储介质。

背景技术

通过网页播放多媒体信息时,多媒体信息的缓冲或加载由网页浏览器完成;具体实现为网页浏览器从当前播放点开始,加载当前播放点至结束点分段的多媒体数据,加载过程中浏览器不能控制缓存或加载的多媒体数据的大小。如此,当用户选择性的观看加载的多媒体数据时,造成了流量的不必要消耗。

发明内容

有鉴于此,本公开实施例提供一种媒体文件加载方法、装置及存储介质,能够在播放多媒体信息时,减少流量的不必要消耗。

一方面,本公开实施例提供一种媒体文件加载方法,包括:

检测播放器播放媒体文件过程中所到达的播放点;

从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;

通过所述播放器加载所获取的内容单元。

另一方面,本公开实施例还提供一种媒体文件加载装置,包括:

检测单元,用于检测播放器播放媒体文件过程中所到达的播放点;

获取单元,用于从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;

其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;

加载单元,用于通过所述播放器加载所获取的内容单元。

又一方面,本公开实施例还提供一种媒体文件加载装置,包括:

存储器,用于存储可执行指令;

处理器,用于通过执行所述存储器中存储的可执行指令实现本公开实施例提供的媒体文件加载方法。

再一方面,本公开实施例提供一种存储介质,存储有可执行指令,所述可执行指令被执行时,用于实现本公开实施例提供的媒体文件加载方法。

可执行指令,可以解释成安装包、程序、代码、插件、库(动态/静态库)的上位概念。

本公开实施例中,检测播放器播放媒体文件过程中所到达的播放点;从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;通过所述播放器加载所获取的内容单元。如此,通过预先将媒体文件划分得到多个内容单元,播放器加载播放点之后的部分内容单元,或加载播放点之后的唯一一个内容,使得用户在选择性观看播放点之后加载的分段媒体文件时,由于播放器预先加载播放点之后的内容单元,能够避免流量的消耗。

附图说明

图1是本公开实施例提供的容器的一个可选的结构示意图;

图2是本公开实施例提供的MP4文件的一个可选的封装结构示意图;

图3是本公开实施例提供的媒体文件中的媒体数据容器存储媒体数据的结构示意图;

图4是本公开实施例提供的FMP4文件的一个可选的封装结构示意图;

图5是本公开实施例提供的媒体文件加载装置的一个可选的结构示意图;

图6是本公开实施例提供的媒体文件加载方法的一个可选处理流程示意图;

图7是本公开实施例提供的获取播放时间位于所述播放点之后的内容单元的一个可选处理流程示意图;

图8是本公开实施例提供的媒体文件为MPEG 4文件格式时,向网页的MSE接口加载内容单元的一个可选处理流程示意图;

图9是本公开示例提供的封装的一个可选的流程示意图;

图10是本公开实施例提供的从元数据容器解析得到媒体信息的一个可选的流程示意图;

图11是本公开实施例提供的通过播放器加载所获取的内容单元的一个可选处理流程示意图;

图12A是本公开实施例在播放器的播放进度条上显示内容单元的摘要信息的示意图;

图12B是本公开实施例在播放器的播放界面的空闲区域显示内容单元的摘要信息的示意图;

图13是本公开实施例通过播放器加载所获取的内容单元的又一个可选处理流程示意图;

图14是本公开实施例提供的播放器通过网页的媒体源扩展接口发送分段媒体文件给网页的媒体元素进行解码播放的流程示意图

图15是本公开实施例提供的播放器通过网页的媒体源扩展接口播放分段媒体文件的一个可选的示意图;

图16是本公开实施例提供的MP4文件转换为FMP4文件并通过媒体源扩展接口播放的一个示意图;

图17是本公开实施例提供的应用于播放器的媒体文件加载方法的另一个可选处理流程示意图;

图18是本公开实施例提供的媒体文件加载装置的组成结构示意图。

具体实施方式

为了使本公开的目的、技术方案和优点更加清楚,下面将结合附图对本公开作进一步地详细描述,所描述的实施例不应视为对本公开的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本公开保护的范围。

除非另有定义,本文所使用的所有的技术和科学术语与属于本公开的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述具体的实施例的目的,不是旨在限制本公开。

对本公开进行进一步详细说明之前,对本公开实施例中涉及的名词和术语进行说明,本公开实施例中涉及的名词和术语适用于如下的解释。

1)媒体文件,以容器(Box,也称为盒子)的方式存储进行编码的媒体数据(例如音频数据和视频数据中的至少一种)的文件,其中还包括用以表达媒体信息以保证媒体数据被正确解码的元数据。

例如,采用MP4容器格式封装多媒体数据的文件被称为MP4文件。典型地,MP4文件中存储高级视频编码(AVC,Advanced Video Coding,即H.264)或MPEG-4(Part 2)规范编码的视频数据和高级音频编码(AAC,Advanced Audio Coding)规范编码的音频数据,当然不排除视频和音频的其他编码方式。

2)容器(Box),也称为盒子,由唯一的类型标识符和长度定义的面向对象的构件,参见图1,是本公开实施例提供的容器的一个可选的结构示意图,包括容器头部(BoxHeader)和容器数据(Box Data),其中填充有用以表达各种信息的二进制数据。

容器头部包括容量(size)和类型(type),容量指明了容器所占用的存储空间的大小,类型指明了容器的类型,参见图2,是本公开实施例提供的MP4文件的一个可选的封装结构示意图,MP4文件中涉及的基本容器类型包括文件类型容器(ftyp box)、元数据容器(moov box)和媒体数据容器(mdat box)。

容器数据部分可以存储具体的数据,此时容器称为“数据容器”,容器数据部分也可以进一步封装其他类型的容器,此时容器称为“容器的容器”。

3)轨道(Track),媒体数据容器中按时间排序的相关的采样(Sample),对于媒体数据来说,轨道表示一个视频帧序列或音频帧序列,而同一轨道的一组连续的采样称为块(Chunk)。

4)文件类型容器,媒体文件中用于存储文件的容量(即所占用字节的长度)和类型的容器,如图2所示,在文件类型容器中存储的二进制数据按照规范的字节长度描述了容器的类型和容量。

5)元数据容器,媒体文件中用于存储元数据(即描述媒体数据容器中存储的多媒体数据的数据)的容器,在MP4文件中的元数据容器中存储的二进制数据表达的信息称为媒体信息。

如图2所示,元数据容器的头部采用二进制数据表示容器的类型为“moov box”,容器数据部分封装用于存储MP4文件的总体信息的mvhd容器,是独立于MP4文件的,并且与MP4文件的播放相关,包括时长、创建时间和修改时间等。

媒体文件的媒体数据容器中可以包括对应多个轨道的子容器,例如音频轨道容器(audio track box)和视频轨道容器(video track box),在音频轨道容器和视频轨道容器的子容器中都包括了相应轨道的媒体数据的引用和描述,必要的子容器包括:用于描述轨道的特性和总体信息(如时长、宽高)的容器(记为tkhd box)、记录轨道的媒体信息(比如媒体类型和采样的信息)的容器(记为mdia box)。

就mdia box中封装的子容器而言,可以包括:记录轨道的相关属性和内容的容器(记为mdhd box),记录媒体的播放过程信息的容器(记为hdlr box),描述轨道中媒体数据的媒体信息的容器(记为minf box);minf box中又封装了用于解释如何定位媒体信息的子容器(记为dinf box)、以及用于记录轨道中采样的所有时间信息(解码时间/显示时间)、位置信息和编解码等信息的子容器(记为stbl box)。

参见图3,是本公开实施例提供的媒体文件中的媒体数据容器存储媒体数据的结构示意图,利用从stbl box容器中二进制数据所识别出的媒体信息,可以解释采样的时间、类型、容量以及在媒体数据容器中的位置,下面说明stbl box中的各个子容器。

stsd box包含了一个采样描述(sample description)表,根据不同的编码方案和存储数据的文件数目,每个媒体文件中可以有一个或多个描述表,通过描述表可以找到每个采样的描述信息,描述信息可以保证采样的正确的解码,不同的媒体类型存储不同的描述信息,例如,视频媒体而言描述信息就是图像的结构。

stts box存储了采样的时长信息,并提供表来映射时间(解码时间)和采样的序号,通过sttx box,可以定位媒体文件中任何时间的采样;stts box中还使用其他的表来映射采样的容量和指针,表中每个条目提供了在同一个时间偏移量里面连续的采样的序号,以及采样的偏移量,递增这些偏移量,可以建立一个完整的时间-采样的映射表,计算公式如下:

DT(n+1)=DT(n)+STTS(n) (1)

其中STTS(n)是第n个采样的时长,DT(n)是第n个采样的显示时间,采样的排列是按照时间的顺序排序,这样偏移量永远是非负的,DT一般以0开始,以第i个采样的显示时间DT(i)为例,计算公式如下:

DT(i)=SUM(for j=0 to i-1 of delta(j)) (2)

所有偏移量的和是轨道中媒体数据的时长。

stss box记录了媒体文件中的关键帧的序号。

stsc box记录了采样与存储采样的块的映射关系,通过表来映射采样的序号和块的序号之间的关系,通过查表可以找到包含指定采样的块。

stco box定义了每个块在轨道中的位置,位置采用在媒体数据容器的起始字节的偏移量、以及相对于所述起始字节的长度(即容量)表示。

stsz box记录了媒体文件中每个采样的容量(即大小)。

6)媒体数据容器,媒体文件中用于存储多媒体数据的容器,例如,在MP4文件中媒体数据容器,如图3所示,采样是媒体数据容器中存储的单位,存储在媒体文件的块中,块和样本的长度均可互不相同。

7)分段媒体文件,媒体文件经过分割形成的子文件,每个分段媒体文件能够被独立解码。

以MP4文件为例,MP4文件中的媒体数据根据关键帧分割,分割后的媒体数据与对应的元数据封装形成FMP4文件,每个FMP4文件中的元数据能够保证媒体数据被正确解码。

例如,在将如图2所示的MP4文件转换为多个分段MP4(Fragmented MP4)文件时,参见图4,是本公开实施例提供的FMP4文件的一个可选的封装结构示意图,一个MP4文件可以转换为多个FMP4文件,每个FMP4文件包括三个基本的容器:moov容器、moof容器和mdat容器。

moov容器包括了MP4文件级别的元数据,用来描述FMP4文件所来源的MP4文件中的全部媒体数据,例如MP4文件的时长、创建时间和修改时间等。

moof容器存储了分段级别的元数据,用于描述所在的FMP4文件中封装的媒体数据,保证FMP4中的媒体数据能够被解码。

1个moof容器和1个mdat容器组成分段MP4文件的1个分段,1个分段MP4文件中可以包括1个或多个这样的分段,每个分段中封装的元数据保证分段中封装的媒体数据能够被独立解码。

下面说明实现本公开实施例的播放器获取给定时段内媒体数据的流程。

当播放一部电影或者一个轨道的时候,播放器必须能够正确的解析数据流,对一定的时间获取对应的媒体数据并确保这一段媒体数据能够被独立解码。

1.确定待获取的媒体数据对应的时段,时段是接续播放当前的播放点的一段时间,播放点对应的时间是相对于媒体时间坐标系统(以媒体文件的播放开始时间为时间原点)的时间度量。

2.检查stts box来确定解码时间对应给定时段的采样的序号。

对于音频帧帧来说,检查stts box来确定解码时间对应给定时段的音频帧的序号。

对于视频帧来说,由于采用压缩算法,给定时段内的首帧如果不是关键帧,还需要根据时间顺序向给定时段的开始时间之前追溯到关键帧,以保证给定时段内的帧能够被解码。

3.根据采用的序号查询stsc box来确定包括采样的块的序号。

4.从stco box中查找块的偏移量。

5.根据采样的序号查找stsz box,找到采样在块内的偏移量和采样的容量。

继续说明实现本公开实施例的查找关键帧的流程。

1.确定给定时间内的采样的序号。

2.检查stss box来发现这个采样之后的关键帧。

3.检查stsc box来发现对应该关键帧的块。

4.从stco box中提取块的偏移量。

5.利用stsz box找到关键帧sample在块内的偏移量和关键帧的容量。

下面首先说明实现本公开实施例的媒体文件加载装置,媒体文件加载装置检测播放器播放媒体文件过程中所到达的播放点;从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;通过所述播放器加载所获取的内容单元。

下面继续说明实现本公开实施例的媒体文件加载装置的结构。

参见图5,是本公开实施例提供的媒体文件加载装置100的一个可选的结构示意图,图5所示的媒体文件加载装置包括:至少一个处理器150、至少一个通信总线160、用户接口180、至少一个网络接口170和存储器190。媒体文件加载装置100中的各个组件通过通信总线160耦合在一起。可以理解,通信总线160用于实现这些组件之间的连接通信。通信总线160除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图5中将各种总线都标为通信总线160。

其中,用户接口180可以包括显示器、键盘、鼠标、轨迹球、点击轮、按键、按钮、触感板或者触摸屏等。网络接口170可以包括标准的有线接口、无线接口可以是WiFi接口。

可以理解,存储器190可以是高速RAM存储器,也可以是非不稳定的存储器(Non-Volatile Memory),例如至少一个磁盘存储器。存储器190还可以是至少一个在物理位置上远离处理器150的存储系统。

本公开实施例提供的应用于媒体文件加载装置的媒体文件加载方法可以应用于处理器150中,或者由处理器150实现。处理器150可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,应用于媒体文件加载装置的媒体文件加载方法中的不同操作可以通过处理器150中的硬件形式的集成逻辑电路或者软件形式的指令完成。上述的处理器150可以是通用处理器、DSP或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。其中,处理器150可以实现或者执行本公开实施例应用于媒体文件加载装置的媒体文件加载方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本公开实施例所提供的应用于媒体文件加载装置的媒体文件加载方法,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。

作为示例,软件模块可以位于存储介质中,存储介质可以是如图5示出的存储器190,处理器150读取存储器190中的可执行指令,结合其硬件完成本公开实施例提供的应用于媒体文件加载装置的媒体文件加载方法的一个可选处理流程,如图6所示,包括如下步骤:

步骤S101,检测播放器播放媒体文件过程中所到达的播放点。

在一些实施例中,播放点可以是通过播放进度的跳转操作所到达的时刻,例如原播放点为播放进度的20%,跳转后的播放点为30%;播放点还可以是通过连续播放的方式所到达的时刻,例如从第30分钟开始连续播放到第40分钟所到达的时刻。

播放器的形态可以是嵌入浏览器的H5播放器,也可以是专用的视频播放应用(APP,Application)。

步骤S102,从媒体文件包括的内容单元中,获取播放时间位于播放点之后的内容单元。

这里,媒体文件可以存储于服务器中,因此,媒体文件加载装置从服务器存储的媒体文件包括的内容单元中,获取播放时间位于播放点之后的内容单元。

其中,内容单元为基于媒体文件根据播放时间发生的内容变换预先划分得到。

在一些实施例中,内容单元依据下述因素至少之一将媒体文件划分形成:媒体文件中的人物、场景和情节。

以媒体文件是春节联欢晚会为例,可以根据春节联欢晚会中的情节(节目内容),将春节联欢晚会划分为多个内容单元。以媒体文件是访谈节目为例,可以根据访谈节目中的人物,将访谈节目划分为多个内容单元。以媒体文件是电影为例,可以根据电影中的场景,将电影划分为多个内容单元。

在一些实施例中,针对媒体文件为动态图像专家组MPEG 4文件格式等不支持流媒体播放的媒体文件,获取播放时间位于所述播放点之后的内容单元的一个可选处理流程,如图7所示,包括以下步骤:

步骤S1021,确定内容单元的播放起始时刻对应的第一时间戳,以及内容单元的播放结束时刻对应的第二时间戳。

步骤S1022,查找解码时间在所述第一时间戳之前、且距离所述第一时间戳最近的第一关键帧,以及解码时间在所述第二时间戳之后、且距离所述第二时间戳最近的第二关键帧。

步骤S1023,从媒体文件中提取第一关键帧和第二关键帧之间的视频帧。

这里,由于第一关键帧的解码时间早于内容单元的播放起始时刻对应的第一时间戳,第二关键帧的解码时间晚于内容单元的播放结束时刻对应的第二时间戳,因此能够使得提取的第一关键帧和第二关键帧之间的视频帧是内容单元中的全部视频帧,避免提取的内容单元中的视频帧的缺失。

步骤S1024,查找解码时间在第一关键帧的解码时间之前、且距离第一关键帧的解码时间最近的第一音频帧,以及解码时间在第二关键帧的解码之后、且距离第二关键帧的解码时间最近的第二音频帧。

由于每个独立的音频帧都可以单独解码,而视频帧中只有关键帧能够表征全部的图像信息,即仅仅通过解码关键帧便能够获得关键帧对应的图像信息;因此,本公开实施例首先获取内容单元对应的起始关键帧(即第一关键帧)和内容单元对应的结束关键帧(即第二关键帧),再通过获取的第一关键帧和第二关键帧分别获取与第一关键帧对应的第一音频帧,以及与第二关键帧对应的第二音频帧;如此,能够保持媒体文件中音频数据与视频数据的一致性,避免仅有视频数据没有音频数据的现象。

步骤S1025,从媒体文件中提取第一音频帧和第二音频帧之间的音频帧。

本公开实施例中,步骤S1023提取的视频帧和步骤S1025提取的音频帧共同构成了播放时间维护播放点之后的内容单元。

在另一些实施例中,针对流媒体格式的媒体文件,获取播放时间位于所述播放点之后的内容单元的一个可选处理流程即为:直接获取媒体文件中内容单元的播放起始时刻和播放结束时刻之间的分段文件;其中,每个分段文件都可以独立解码播放。

步骤S103,通过播放器加载所获取的内容单元。

在一些实施例中,针对流媒体格式的媒体文件,如HLS和FLV,加载的内容单元为媒体文件中与内容单元的播放起始时刻和播放结束时刻之间的可以独立解码播放的分段;当播放器以内嵌于网页的方式运行时,向网页的MSE接口加载所获取的内容单元,MSE接口用于供所述播放器调用网页的媒体元素播放所获取的内容单元。

这里,所述网页可以是浏览器的网页,或者内嵌有浏览器内核的APP的网页。

MSE接口供所述播放器调用网页的媒体元素播放所获取的内容单元的一种实现方式为:MSE接口创建媒体源(Media Source)对象作为虚拟统一资源定位符(UniformResource Locator,URL)的源,创建缓存对象(Source Buf fer)作为媒体源的缓存,向缓存对象添加内容单元的相邻两个或多个关键帧之间的帧(包括视频帧和音频帧);调用网页的媒体元素播放虚拟URL;这里,媒体元素为audio/video标签。

在另一些实施例中,当媒体文件为MPEG 4文件格式时,向网页的MSE接口加载内容单元的一个可选处理流程,如图8所示,包括以下步骤:

步骤S1031,从媒体文件中提取内容单元对应的视频帧。

在一些实施例中,提取内容单元对应的视频帧的具体实现过程与步骤S1023的具体实现过程相同。

并且,在提取内容单元对应的视频帧之后,需提取内容单元对应的音频帧;提取内容单元对应的音频帧的具体实现过程与步骤S1025的具体实现过程相同。

步骤S1032,将内容单元对应的视频帧封装为分段媒体文件。

在一些实施例中,需要将内容单元对应的视频帧和音频帧共同封装为分段媒体文件。

这里,所述分段媒体文件能够被独立解码。

步骤S1033,将多个分段媒体文件封装为多媒体数据对象。

在一些实施例中,播放器从服务器获取媒体文件中对应给定时段的媒体数据,其中给定时段用于接续播放点,将根据媒体数据、以及描述所述媒体数据的元数据根据分段媒体文件的封装结构进行封装,形成能够用于被网页的媒体元素独立解码的分段媒体文件。

参见图9,图9是本公开示例提供的封装分段媒体文件的一个可选的流程示意图,将结合图9示出的步骤进行说明。

步骤S201,将表示所述分段媒体文件的类型和兼容性的数据,填充到所述分段媒体文件的文件类型容器中。

例如,以封装形成如图4时所示的封装结构的FMP4文件为例,在FMP4文件的文件类型容器即ftyp box的头部填充容器的类型和长度(表示ftyp box的整体长度),在ftyp box的数据部分填充生成表示文件类型为FMP4以及兼容协议的数据(二进制数据)。

步骤S202,将表示所述分段媒体文件的文件级别的元数据,填充到所述分段媒体文件的元数据容器中。

在一些实施例中,根据向分段媒体文件的封装结构待填充的媒体数据,根据分段媒体文件中的元数据容器的嵌套结构,计算填充嵌套结构所需要的描述媒体数据的元数据。

仍以图4为例,计算表示FMP4文件的文件级别的元数据,并填充到FMP4的元数据容器(即moov box)中,在moov box中嵌套有mvhd、track和视频扩展(mvex,movie extend)三个容器。

其中,mvhd容器中封装的元数据用于表示与分段媒体文件的播放相关的媒体信息,包括位置、时长、创建时间和修改时间等;track容器中嵌套的子容器表示媒体数据中相应轨道的引用和描述,例如track容器中嵌套有描述轨道的特性和总体信息(如时长、宽高)的容器(记为tkhd box)、记录轨道的媒体信息(比如媒体类型和采样的信息)的容器(记为mdia box)。

步骤S203,将所提取的媒体数据、以及描述所述媒体数据的元数据,对应填充到所述分段媒体文件的分段容器中的媒体数据容器、以及分段级别的元数据容器中。

在一些实施例中,分段媒体文件中可以封装有一个或多个分段(fragment),对于待填充的媒体数据而言,可以填充到分段媒体文件的一个或分段的媒体数据容器(即mdatbox)中,每个分段中封装有分段级别的元数据容器(记为moof box),其中填充的元数据用以描述分段中填充的媒体数据,使分段能够被独立解码。

结合图4,以将待填充的媒体数据填充到FMP4文件的封装结构的2个分段中为例,填充到每个分段媒体数据;计算需要填充到相应分段的分段级别的元数据容器(即moofbox)中的元数据,并对应填充到moof box嵌套的子容器中,其中在moof box的头部称为moof box,其中填充的二进制数据用于表示容器的类型为“moof box”以及moof box的长度。

在步骤S201至步骤S203中填充数据到相应容器的一些实施例中,当执行填充操作时,调用类的写操作功能在所述子容器的内存缓冲区完成二进制数据的写入和合并,以及,返回所述类的实例,所返回的实例用于合并所述子容器与具有嵌套关系的子容器的合并。

作为填充数据的一个示例,建立用于实现封装功能的类MP4,将分段媒体文件中的每个子容器封装为类Stream的静态方法;建立用于实现二进制数据操作功能的类Stream,每个类Stream提供有一个内存缓冲区,用来保存待填充的二进制数据;通过Stream提供的静态方法,转换待填充的多字节十进制数据到二进制数据;通过类Stream的实例提供的写操作功能,在内存缓冲区完成待填充到子容器的二进制数据的合并以及填充;Stream提供的静态方法返回一个新的Stream实例,可以实现当前子容器与其他具有嵌套关系的子容器的合并。

分段媒体文件的封装之前,需要计算待填充的媒体数据的元数据,这需要结合媒体文件中的元数据计算,以得到分段媒体文件级别的元数据(例如对于FMP4文件而言,对应填充到moov box中的元数据),以及分段媒体文件中分段级别的元数据(例如对应FMP4文件而言,对应填充到moof box中的元数据)。

下面,说明解析媒体文件的元数据容器中封装的元数据得到用于描述媒体文件的媒体数据容器中封装的媒体数据的媒体信息的示例性实施。

在本公开的一些实施例中,媒体文件为MP4文件,解析媒体文件的元数据容器中子容器的嵌套结构,根据嵌套结构读取出各子容器中的二进制数据;从所读取出的二进制数据解析出各子容器表征的媒体数据的媒体信息。

结合图2所示的结构,MP4文件的moov容器为嵌套结构,对元数据容器中子容器的嵌套结构进行解析,确定moov容器所嵌套的子容器,例如mvhd容器、音频轨道容器和视频轨道容器等,如果子容器还嵌套有容器则继续解析,直至解析到不再嵌套有容器的子容器时,读取相应的子容器中封装的二进制数据,解析得到二进制数据所表示的媒体消息,例如stss box记录的媒体文件中的关键帧的序号,stsz box记录的媒体文件中每个采样的容量(即大小),等等。

在本公开的一些实施例中,提供根据容器类型设置解析器,根据容器类型解析元数据容器中的子容器从而得到媒体信息的方式,将结合图9进行说明。

参见图10,图10是本公开实施例提供的从元数据容器解析得到媒体信息的一个可选的流程示意图,将结合图10示出的步骤进行说明。

步骤S301,定位元数据容器在媒体文件中的位置。

在一些实施例中,通过从媒体文件的二进制数据读取符合容器头部规范的二进制数据,根据读取的二进制数据中识别的容器的类型和长度,直至定位元数据容器在媒体文件中的偏移量和容量。

举例来说,对于媒体文件的二进制数据,从零字节起始的二进制数据对应文件类型容器,通过容器头部的规范长度,读取媒体文件的二进制数据的起始位置,读取符合容器头部的规范长度的二进制数据,解析读取的二进制数据可以确定媒体文件中位于文件类型容器之后的容器的类型和长度。

如果解析出的类型是文件类型容器,则可以解析出元数据容器的长度(即容量),此时元数据容器的偏移量为文件类型容器的长度。

如果解析出的类型是媒体数据容器,则根据媒体数据容器的长度和分类型容器的长度为偏移量,继续读取符合容器头部的规范长度的二进制数据,从而可以解析出元数据容器的长度(即容量),此时元数据容器的长度为文件类型容器的长度与媒体数据容器的长度的加和。

媒体文件中除了起始的容器是文件类型容器,后续容器的封装顺序没有规范,通过上述解析方式,不管媒体文件中容器的封装顺序是文件类型容器、元数据容器和媒体数据容器,还是文件类型容器、媒体数据容器和元数据容器,都能够准确高效定位文件类型容器在媒体文件中的位置。

步骤S302,根据元数据容器在媒体文件中的位置从媒体文件的二进制数据中获取对应元数据容器的二进制数据。

元数据容器在媒体文件中的位置以偏移量和容量表示,从媒体文件中读取以偏移量对应的位置开始读取二进制数据,直至读取的二进制数据的长度符合元数据容器的容量,从而读取出元数据容器对应的二进制数据。

步骤S303,顺序解析元数据容器二进制数据中对应容器头部的规范长度的二进制数据,得到元数据容器中子容器的容器类型、以及子容器的容器数据的长度。

在一些实施例中,针对元数据容器中嵌套多个子容器的情况,每次读取二进制数据的偏移量都是已经识别出子容器长度的加和,所读取的二进制数据的长度符合容器头部的规范长度,从而可以解析出当前所处理子容器的类型和长度。

例如,首次读取时,从元数据容器的二进制数据的零字节开始读取二进制数据,且所读取的二进制数据的长度符合容器头部的规范长度,从而可以解析出第一个子容器的类型和长度;第二次读取时,以首次读取的子容器的长度为偏移量,开始读取二进制数据,且所读取的二进制数据的长度符合容器头部的规范长度,从而可以解析出第二个子容器的类型和长度。

通过上述方式读取二进制数据不会出现多读导致回退的情况,也不会出现及少读而二次读取的情况,解析的效率和正确率得以保证。

步骤S304,调用与子容器的容器类型相应类型的解析器,顺序解析未解析的数据中与容器数据的长度相应的二进制数据,得到容器数据所表示的媒体信息。

在一些实施例中,对元数据容器中嵌套的典型容器类型进行预标记,用于表示容器是直接用于封装二进制数据还是进一步封装有容器,例如对于图2示出的mvhd box、audio track box和video track box等标记进一步封装有容器,对于图2示出的stts box、stsd box等标记为直接封装有二进制数据。

对于标记为直接封装二进制数据的容器类型,设置与容器类型一一对应的解析器,解析器用于根据二进制数据解析出所表示的媒体信息;在步骤S304中,将在步骤S303中解析出的子容器的容器类型与预标记的容器类型比对时,涉及到以下两种情况。

情况1)当通过比对确定子容器的容器类型被预标记、且被预标记为用于直接封装二进制数据时,则调用与子容器的容器类型对应的解析器,通过解析器解析子容器中的容器数据,得到容器数据所表示的媒体信息。

情况2)当通过比对确定子容器的容器类型被预标记、且被预标记为用于继续封装容器时,根据媒体文件中容器头部的规范长度,递归解析子容器所对应的二进制数据,直至解析到子容器中所封装容器的容器类型被预标记、且被预标记为用于直接封装二进制数据,调用与子容器中所封装容器的容器类型相应的解析器,逐字节解析二进制数据,所解析二进制数据的长度与子容器中所封装容器的容器数据的长度对应,以得到子容器中所封装容器的容器数据所表示的媒体信息。

在一些实施例中,对解析元数据容器的过程中记录媒体信息的方式进行说明,在顺序解析元数据容器二进制数据中对应容器头部的规范长度的二进制数据,得到元数据容器中子容器的容器类型时,根据子容器与所归属的容器之间的嵌套关系、以及子容器与所封装的容器嵌套关系建立对象,当子容器的容器类型被预标记为用于直接封装二进制数据时,在对应子容器所建立的对象中存储包括有媒体信息的数组,所存储的媒体信息由子容器的容器数据表示。

例如,在图2中,当解析的子容器的类型为stts box时,由于stts box被预标记为直接封装二进制数据,在对应stts box所建立的对象中存储包括有媒体信息的数组,这里的媒体信息是stts box的容器数据所表示的时长信息。

在一些实施例中,对解析元数据容器的过程中记录子容器之间的嵌套关系的方式说明,在顺序解析元数据容器二进制数据中对应容器头部的规范长度的二进制数据,得到元数据容器中子容器的容器类型时,如果容器类型被预标记为直接封装二进制数据,则在被调用的解析器中记录所解析的子容器;将所记录的子容器的实例设置到子容器属性中,子容器属性包括于子容器所归属的容器,用于描述子容器与所归属的容器之间的嵌套关系。

例如,在图2中,当解析的子容器的类型为stsd box时,由于stsd box被预标记为直接封装二进制数据,在对应stsd box所对应的解析器中记录stsd box,将stsd box的实例设置到stbl box子容器属性中,以此类推,最后在stsd box的子容器属性中记录了stsdbox、stts box、stsc box等多个嵌套于stbl box的子容器。

在一些实施例中,通过比对确定子容器的容器类型没被预标记、或者被预标记为直接封装二进制数据但是没有调用到相应类型的解析器时,忽略解析子容器对应的二进制数据,根据子容器的长度,跳转到二进制数据中对应下一子容器的部分继续解析。

事实上,媒体文件中会出现自定义的容器类型,通过跳转的方式不会影响元数据容器的整体解析的进度,同时通过设置解析器的方式,当元数据容器的容器类型发生变动时,通过对相应类型的解析器的增加、删除和修改,可以快速实现对最新的元数据容器的兼容解析,具有升级灵活快速的特点。

本公开实施例中,通过播放器加载所获取的内容单元的一个可选处理流程,如图11所示,包括:

步骤S401,在播放器的播放界面显示内容单元的摘要信息。

这里,摘要信息用于表征内容单元的主要信息,如内容单元对应的场景、人物、情节等。以媒体文件是春节联欢晚会为例,内容单元的摘要信息可以包括:类型(小品、歌曲、舞蹈等)、人物(表演者、作曲者、编舞者等)、表演时长等信息。

在一些实施例中,如图12A所示,可以在播放器的播放进度条上显示内容单元的摘要信息。

在另一些实施例中,如图12B所示,也可以在播放器的播放界面的空闲区域显示内容单元的摘要信息。

在显示内容单元的摘要信息时,可以显示预设数量的内容单元的摘要信息,也可以显示全部数量的内容单元的摘要信息,还可以显示预设时长内所包括的内容单元的摘要信息。

步骤S402,响应基于摘要信息选定内容单元的操作。

在一些实施例中,用户基于显示的内容单元的摘要信息,通过鼠标点击等方式触发选定待加载的内容单元。

步骤S403,通过播放器加载所选定的内容单元。

本公开实施例中,当未通过人机交互确定被选定的内容单元时,通过播放器加载所获取的内容单元的另一个可选处理流程为:

按照获取的至少一个内容单元的起始时刻对应的时间戳,通过所述播放器顺序加载所述至少一个内容单元。

这里,所述顺序加载,是指按照内容单元的起始时刻对应的时间先后顺序。

在具体实施时,为节省缓存空间,不同时加载播放点之后的全部内容单元,仅加载播放点之后的部分内容单元。当然,播放点之后仅有一个内容单元时,便加载该内容单元。

在加载多个内容单元时,可以区别化显示已加载的内容单元,如在进度条上以不同的颜色显示已加载的不同的内容单元,或者在进度条上以不同的对比对显示已加载的不同的内容单元。

本公开实施例中,通过播放器加载所获取的内容单元的又一个可选处理流程,如图13所示,包括:

步骤S801,获取媒体文件包括的内容单元的请求次数的降序排序。

在一些实施例中,首先获取媒体文件包括的内容单元的请求次数,再将获取的内容单元的请求次数按照降序的顺序进行排列。

具体实施为,根据用户画像,查找同类用户对内容单元的请求次数,将同类用户对内容单元的请求次数进行降序排列。

这里,内容单元的请求次数,也可以理解为内容单元的历史播放次数。

步骤S802,按照请求次数的降序顺序加载至少一个内容单元。

在具体实施时,为节省缓存空间,不同时加载播放点之后的全部内容单元,仅加载播放点之后的部分内容单元。当然,播放点之后仅有一个内容单元时,便加载该内容单元。

继续说明播放器向网页的媒体源扩展接口发送分段媒体文件给网页的媒体元素进行解码播放的过程。

参见图14,是本公开实施例提供的播放器通过网页的媒体源扩展接口发送分段媒体文件给网页的媒体元素进行解码播放的流程示意图,将结合图14示出的步骤进行说明。

步骤S501,播放器将分段媒体文件添加到媒体资源扩展接口中的媒体源对象。

参见图15,图15是本公开实施例提供的播放器通过网页的媒体源扩展接口播放分段媒体文件的一个可选的示意图,当播放器在网页中播放窗口(播放器对应播放窗口)接收到媒体文件的播放事件时,播放器通过执行MediaSource方法创建媒体源(Media Source)对象;执行媒体源扩展接口中封装的addSourceBuffer方法创建MediaSource对象的缓存,即源缓存(SourceBuffer)对象,一个MediaSource对象拥有一个或多个SourceBuffer对象,每个SourceBuffer对象可以用于对应网页中的一个播放窗口,用于接收窗口中待播放的分段媒体文件。

在媒体文件的播放过程中,播放器中的解析器(Parser)通过解析新获取的媒体数据,不断构造新的分段媒体文件,通过执行SourceBuffer对象的appendBuffer方法,添加分段媒体文件到同一个SourceBuffer对象的SourceBuffer对象。

步骤S502,播放器调用媒体资源扩展接口创建对应媒体源对象的虚拟地址。

例如,播放器执行媒体源扩展接口中封装的createObjectURL方法,创建对应媒体源对象的虚拟地址,即虚拟URL,其中封装有Blob类型的分段媒体文件。

此外,播放器将MediaSource对象设置为虚拟URL的源(src)属性,也就是将虚拟URL与网页中的媒体元素如video/audio元素绑定,这个过程也称为将媒体源对象关联到网页中的媒体元素。

步骤S503,播放器向网页的媒体元素传递虚拟地址,虚拟地址用于供媒体元素以媒体源对象为数据源进行播放。

例如,播放器中包括有调用媒体元素播放虚拟URL的语句,例如:<audio>虚拟URL。当浏览器解释网页中嵌入的播放器中对应的语句时,使得浏览器的媒体元素到虚拟URL绑定的SourceBuffer对象中读取分段媒体文件,并解码播放。

下面,以播放器将MP4文件转换FMP4文件并通过媒体源扩展接口在网页播放的过程进行说明。

参见图16,图16为本公开实施例提供的MP4文件转换为FMP4文件并通过媒体源扩展接口播放的一个示意图,播放器基于媒体文件的真实地址(http://www.toutiao.com/a/b.mp4),从服务器请求获取MP4文件中部分的媒体数据,例如解码时间处于用于接续播放点的给定时段的数据。

播放器基于获取的媒体数据构造FMP4文件,然后添加到MediaSource对象对应的SourceBuffer对象,由于虚拟URL被绑定到MediaSource对象,因此播放器调用audio/video元素的代码被执行时,audio/video元素从MediaSource对象的SourceBuffer对象读取被不断添加的新的FMP4文件,并解码,实现媒体文件的连续播放。

本公开实施例提供的应用于播放器的媒体文件加载方法的另一个可选处理流程,如图17所示,包括:

步骤S601,播放器检测播放媒体文件过程中所到达的播放点。

步骤S602,播放器从服务器存储的媒体文件包括的内容单元中,获取播放时间位于播放点之后的内容单元。

步骤S603,播放器加载所获取的内容单元。

步骤S604,播放器响应于改变显示分辨率的请求,确定接收所述请求的时刻对应的第三时间戳,以及当前所播放的内容单元结束时刻的第四时间戳。

在一些实施例中,播放器接收用户触发的改变媒体文件的显示分辨率的请求,并确定接收所述请求的时刻对应的第三时间戳,以及当前所播放的内容单元结束时刻的第四时间戳。

步骤S605,播放器从服务器获取播放时间位于所述第三时间戳和所述第四时间戳之间、且为切换的目标分辨率的新内容单元。

在一些实施例中,播放器查找解码时间在第三时间戳之后、且距离第三时间戳最近的第三视频帧,以及解码时间在第四时间戳之前、且距离第四时间戳最近的第四视频帧;播放器从服务器存储的媒体文件中提取第三视频帧和第四视频帧之间的视频帧,作为新内容单元,新内容单元以请求的目标分辨率进行播放。

步骤S606,播放器加载所获取的新内容单元以替换原分辨率的内容单元。

本公开实施例中,播放器的形态可以是嵌入网页的H5播放器,也可以是专用的视频播放APP。

基于上述媒体文件加载方法,本公开实施例还提供一种媒体文件加载装置,所述媒体文件加载装置700的组成结构,如图18所示,包括:

检测单元701,用于检测播放器播放媒体文件过程中所到达的播放点;

获取单元702,用于从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;

其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;

加载单元703,用于通过所述播放器加载所获取的内容单元。

在一些实施例中,所述获取单元702,还用于确定所述内容单元的播放起始时刻对应的第一时间戳,以及所述内容单元的播放结束时刻对应的第二时间戳;

查找解码时间在所述第一时间戳之前、且距离所述第一时间戳最近的第一关键帧,以及解码时间在所述第二时间戳之后、且距离所述第二时间戳最近的第二关键帧;

从所述媒体文件中提取所述第一关键帧和所述第二关键帧之间的视频帧。

在一些实施例中,所述获取单元702,还用于查找解码时间在所述第一关键帧的解码时间之前、且距离所述第一关键帧的解码时间最近的第一音频帧,以及解码时间在所述第二关键帧的解码之后、且距离所述第二关键帧的解码时间最近的第二音频帧;

从所述媒体文件中提取所述第一音频帧和所述第二音频帧之间的音频帧。

在一些实施例中,所述加载单元703,还用于当所述播放器以内嵌于所述网页的方式运行时,

向所述网页的媒体资源扩展接口加载所述内容单元,所述媒体资源扩展接口用于供所述播放器调用所述网页的媒体元素播放所述内容单元。

在一些实施例中,所述加载单元703,还用于当所述媒体文件为MPEG 4文件格式时,

从所述媒体文件中提取所述内容单元对应的视频帧;

将所述内容单元对应的视频帧封装为分段媒体文件,所述分段媒体文件能够被独立解码;

将所述多个分段媒体文件封装为多媒体数据对象。

在一些实施例中,所述加载单元703,还用于在所述播放器的播放界面显示所述内容单元的摘要信息;

响应基于所述摘要信息选定内容单元的操作;

通过所述播放器加载所选定的内容单元。

在一些实施例中,所述加载单元703,还用于当未通过人机交互确定被选定的内容单元时,

按照获取的至少一个内容单元的起始时刻对应的时间戳,通过所述播放器顺序加载所述至少一个内容单元。

在一些实施例中,所述加载单元703,还用于获取所述媒体文件包括的内容单元的请求次数的降序排序;

按照所述请求次数的降序顺序加载所述至少一个内容单元。

在一些实施例中,所述获取单元702,还用于响应于改变显示分辨率的请求,确定接收所述请求的时刻对应的第三时间戳,以及当前所播放的内容单元结束时刻的第四时间戳;获取播放时间位于所述第三时间戳和所述第四时间戳之间、且为切换的目标分辨率的新内容单元;

所述加载单元703,还用于通过所述播放器加载所获取的新内容单元以替换原分辨率的内容单元。

本公开实施例中,媒体文件加载装置可以实施为播放器,播放器的形态可以是嵌入浏览器的H5播放器,也可以是专用的视频播放应用APP。

本公开实施例还提供一种存储介质,所述存储介质中存储有可执行指令,可执行指令被执行时,用于实现以下操作:

检测播放器播放媒体文件过程中所到达的播放点;

从所述媒体文件包括的内容单元中,获取播放时间位于所述播放点之后的内容单元;

其中,所述内容单元为基于所述媒体文件根据播放时间发生的内容变换划分得到;

通过所述播放器加载所获取的内容单元。

在一些实施例中,可执行指令被执行时,还用于实现以下操作:确定所述内容单元的播放起始时刻对应的第一时间戳,以及所述内容单元的播放结束时刻对应的第二时间戳;

查找解码时间在所述第一时间戳之前、且距离所述第一时间戳最近的第一关键帧,以及解码时间在所述第二时间戳之后、且距离所述第二时间戳最近的第二关键帧;

从所述媒体文件中提取所述第一关键帧和所述第二关键帧之间的视频帧。

在一些实施例中,可执行指令被执行时,还用于实现以下操作:查找解码时间在所述第一关键帧的解码时间之前、且距离所述第一关键帧的解码时间最近的第一音频帧,以及解码时间在所述第二关键帧的解码之后、且距离所述第二关键帧的解码时间最近的第二音频帧;

从所述媒体文件中提取所述第一音频帧和所述第二音频帧之间的音频帧。

在一些实施例中,可执行指令被执行时,还用于实现以下操作::当所述播放器以内嵌于所述网页浏览器的方式运行时,

向所述网页浏览器的MSE接口加载所述内容单元,所述媒体资源扩展接口用于供所述播放器调用所述网页的媒体元素播放所述内容单元。

在一些实施例中,可执行指令被执行时,还用于实现以下操作::当所述媒体文件为MPEG 4文件格式时,

从所述媒体文件中提取所述内容单元对应的视频帧;

将所述内容单元对应的视频帧封装为分段媒体文件,所述分段媒体文件能够被独立解码;

将所述多个分段媒体文件封装为多媒体数据对象。

在一些实施例中,可执行指令被执行时,还用于实现以下操作::在所述播放器的播放界面显示所述内容单元的摘要信息;

响应基于所述摘要信息选定内容单元的操作;

通过所述播放器加载所选定的内容单元。

在一些实施例中,可执行指令被执行时,还用于实现以下操作::当未通过人机交互确定被选定的内容单元时,

按照获取的至少一个内容单元的起始时刻对应的时间戳,通过所述播放器顺序加载所述至少一个内容单元。

在一些实施例中,可执行指令被执行时,还用于实现以下操作::获取所述媒体文件包括的内容单元的请求次数的降序排序;

按照所述请求次数的降序顺序加载所述至少一个内容单元。

在一些实施例中,可执行指令被执行时,还用于实现以下操作::当通过所述播放器加载所获取的内容单元之后,

响应于改变显示分辨率的请求,确定接收所述请求的时刻对应的第三时间戳,以及当前所播放的内容单元结束时刻的第四时间戳;

获取播放时间位于所述第三时间戳和所述第四时间戳之间、且为切换的目标分辨率的新内容单元;

通过所述播放器加载所获取的新内容单元以替换原分辨率的内容单元。

综上所述,应用本公开上述实施例,具备以下有益效果:

1、通过预先将媒体文件划分得到多个内容单元,播放器加载播放点之后的部分内容单元,或加载播放点之后的唯一一个内容单元,使得用户在选择性观看播放点之后加载的内容单元时,由于播放器预先加载播放点之后的内容单元,能够避免流量的消耗。

2、当需要播放媒体文件的给定时段时,只需要从非流媒体格式的媒体文件提取给定时间的媒体数据,封装为可独立解码的分段媒体文件即可,通过这种方式,一方面,克服了非流媒体格式文件需要完整下载后才可以独立播放的限制,播放实时性好;另一方面,由于仅需要针对给定时段构造分段媒体文件,而不是将完整的媒体文件预先转换为流媒体格式,转换延迟小因此不需要预先存储,除了原始的媒体文件不会占用额外的存储空间,显著降低了对存储空间的占用。

3、将非流媒体格式的媒体文件中的媒体数据转换成分段媒体文件,并通过网页的媒体源扩展接口,发送给网页的媒体元素进行解码播放,实现了播放器通过所内嵌于的网页播放非流媒体格式的媒体文件,克服了非流媒体封装格式文件需要完整下载后才可以独立播放的限制。

4、播放器获取的是媒体文件的关键帧之间的部分媒体数据,实现了对播放媒体文件过程中,媒体数据加载的控制。

5、所封装得到的分段媒体文件基于获取的媒体文件的部分媒体数据,而非媒体文件的全部数据,如此,转换延迟小,不需要预先存储,除了原始的媒体文件不会占用额外的存储空间,显著降低了对存储空间的占用,进一步使得在用户观看过程中进行分辨率切换时,不会出现黑屏或卡顿,提高了分辨率切换的实时性。

6、网页的媒体元素基于虚拟地址获取分段媒体文件进行解码播放,而非基于媒体文件的真实地址进行媒体数据获取并播放,实现了对MP4文件的真实地址的保护。

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

31页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:基于离线转换的播放控制方法、装置及存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类