媒体播放的加载控制方法、装置及存储介质与流程

文档序号:19347248发布日期:2019-12-06 20:59阅读:437来源:国知局
媒体播放的加载控制方法、装置及存储介质与流程

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



背景技术:

在通过网页播放媒体文件时,网页会基于当前的播放点预加载后续的媒体数据,直至加载了从当前播放点到结束时间的全部媒体数据。每次切换播放点之后,网页会重新加载从当前播放点至结束点的全部媒体数据。一方面,需要重复请求媒体数据进行加载,另一方面,加载的媒体数据用户可能不会观看(例如用户在跳跃式观看时);这导致预加载的媒体数据对流量和带宽的不必要消耗,同时因占用网络造成网页中的其他业务出现延迟。



技术实现要素:

有鉴于此,本公开实施例提供一种媒体播放的加载控制方法、装置及存储介质,能够实现对预加载的媒体数据的控制,使得预加载的媒体数据所对应的时长为固定时长。

本公开实施例的技术方案是这样实现的:

第一方面,本公开实施例提供一种媒体播放的加载控制方法,包括:

在内嵌于网页的播放器播放的过程中,检测所述播放器预加载的媒体数据所对应的时长;

当所述预加载的媒体数据所对应的时长小于固定时长时,获取使得预加载的媒体数据满足所述固定时长的媒体数据;

通过媒体源扩展接口,将获取的所述媒体数据发送给内嵌所述播放器的所述网页的媒体元素进行预加载。

第二方面,本公开实施例提供一种媒体播放的加载控制装置,包括:

检测单元,用于在内嵌于网页的播放器播放的过程中,检测所述播放器预加载的媒体数据所对应的时长;

获取单元,用于当所述预加载的媒体数据所对应的时长小于固定时长时,获取使得预加载的媒体数据满足所述固定时长的媒体数据;

发送单元,用于通过媒体源扩展接口,将获取的所述媒体数据发送给所述网页的媒体元素进行预加载。

第三方面,本公开实施例提供一种媒体播放的加载控制装置,包括:

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

处理器,用于执行所述可执行指令时,实现本公开实施例的媒体播放的加载控制方法。其中,可执行指令可以为安装包、程序、代码、插件、库(动态/静态库)。

第四方面,本公开实施例提供一种存储介质,存储有可执行指令,所述可执行指令被处理器执行时,实现本公开实施例的媒体播放的加载控制方法。

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

实现了播放器在播放过程中对预加载的媒体数据的控制,使得预加载的媒体数据所对应的时长为固定时长,避免了预加载的媒体数据为当前播放点到结束时间的全部媒体数据所导致的流量和带宽的不必要消耗,同时,缓解了因占用网络造成的网页中的其他业务的延迟。

附图说明

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

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

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

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

图5为本公开实施例提供的媒体播放的加载控制装置的硬件组成结构示意图;

图6为本公开实施例提供的媒体播放的加载控制方法的流程示意图一;

图7为本公开实施例提供的封装分段媒体文件的流程示意图;

图8为本公开实施例提供的播放器通过网页的媒体源扩展接口播放分段媒体文件的示意图;

图9为本公开实施例提供的mp4文件转换为fmp4文件并通过媒体源扩展接口播放的示意图;

图10为本公开实施例提供的差异化显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段的示意图;

图11为本公开实施例提供的媒体播放的加载控制方法的流程示意图二;

图12为本公开实施例提供的媒体播放的加载控制装置的组成结构示意图。

具体实施方式

以下结合附图及实施例,对本公开进行进一步详细说明。应当理解,此处所提供的实施例仅仅用以解释本公开,并不用于限定本公开。另外,以下所提供的实施例是用于实施本公开的部分实施例,而非提供实施本公开的全部实施例,在不冲突的情况下,本公开实施例记载的技术方案可以任意组合的方式实施。

需要说明的是,在本公开实施例中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的方法或者装置不仅包括所明确记载的要素,而且还包括没有明确列出的其他要素,或者是还包括为实施方法或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的方法或者装置中还存在另外的相关要素(例如方法中的步骤或者装置中的单元,例如的单元可以是部分电路、部分处理器、部分程序或软件等等)。

例如,本公开实施例提供的媒体播放的加载控制方法包含了一系列的步骤,但是本公开实施例提供的媒体播放的加载控制方法不限于所记载的步骤,同样地,本公开实施例提供的媒体播放的加载控制装置包括了一系列单元,但是本公开实施例提供的装置不限于包括所明确记载的单元,还可以包括为获取相关信息、或基于信息进行处理时所需要设置的单元。

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

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

例如,采用mp4容器格式封装媒体数据的文件被称为mp4文件,典型地,mp4文件中存储高级视频编码(avc,advancedvideocoding,即h.264)或mpeg-4(part2)规范编码的视频数据和高级音频编码(aac,advancedaudiocoding)规范编码的音频数据,当然不排除视频和音频的其他编码方式。

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

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

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

3)轨道(track),媒体数据容器中按时间排序的相关的采样(sample),对于媒体数据来说,轨道表示一个视频帧序列或一个音频帧序列,还可以包括与视频帧序列同步的字幕轨,同一轨道中的一组连续的采样称为块(chunk)。

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

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

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

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

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

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

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

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

dt(n+1)=dt(n)+stts(n)(1)

其中stts(n)是没有压缩的stts第n项信息,dt是第n个采样的显示时间,采样的排列是按照时间的顺序排序,这样偏移量永远是非负的,dt一般以0开始,dt计算公式如下:

dt(i)=sum(forj=0toi-1ofdelta(j))(2)

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

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

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

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

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

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

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

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

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

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

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

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

8)媒体资源扩展(mse,mediasourceextensions)接口,在网页中实现的面向播放器的接口,在网页中的加载期间通过网页的解释器解释、执行前端编程语言(例如javascript)而实现,向播放器提供调用超文本标记语言(html)媒体元素(mediaelement)的播放媒体流的功能,例如使用视频元素<video>、以及音频元素<audio>来实现视频/音频的播放功能。

9)流媒体格式,把媒体数据封装为流媒体的文件,媒体文件不必完整下载、不需要额外转码,即可被解码播放,即,原生地支持一边下载,一边播放的封装技术。典型的流媒体格式的文件如,基于http直播流(hls,httplivestreaming)技术的ts媒体文件分片,flv(flashvideo)文件等。

10)非流媒体格式,把媒体数据封装为媒体文件、且媒体文件完整下载后才可以被解码播放的封装技术,典型的非流媒体格式的文件包括:mp4文件,mkv文件格式(mkv,mkvfileformat),视窗媒体视频(wmv,windowsmediavideo)文件,高级串流格式(asf,advancedstreamingformat)文件等。

需要指出,mp4文件原生不支持流媒体播放,但是通过在线转码后向播放器转码后的媒体流、或者部分下载的mp4文件的缺失部分填充无效的二进制数据(例如,在ftyp容器和moov容器完整下载的情况下,填充mdat容器的缺失部分以无效的二进制数据代替)也能实现一边下载一遍播放的技术效果,本文中这种原生不支持流媒体播放的文件的封装格式都称为非流媒体格式。

首先说明实现本公开实施例的媒体播放的加载控制装置,媒体播放的加载控制装置可以提供为硬件、软件或者软硬件结合的方式。

下面说明媒体播放的加载控制装置的软件硬件结合的实施,参见图5,图5为本公开实施例提供的媒体播放的加载控制装置的一个可选的组成结构示意图,本公开实施例的媒体播放的加载控制装置可以以各种形式来实施,如:由智能手机、平板电脑和台式机等终端单独实施,或者由终端、服务器协同实施。下面对本公开实施例的媒体播放的加载控制装置的硬件结构做详细说明,可以理解,图5仅仅示出了媒体播放的加载控制装置的示例性结构而非全部结构,根据需要可以实施图5示出的部分结构或全部结构。

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

其中,用户接口103可以包括显示器、键盘、鼠标、轨迹球、点击轮、按键、按钮、触感板或者触摸屏等。

可以理解,存储器102可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。

本公开实施例中的存储器102用于存储各种类型的数据以支持媒体播放的加载控制装置100的操作。这些数据的示例包括:用于在媒体播放的加载控制装置100上操作的任何可执行指令,如可执行指令1021,实现本公开实施例的媒体播放的加载控制方法的程序可以包含在可执行指令1021中。

本公开实施例揭示的媒体播放的加载控制方法可以应用于处理器101中,或者由处理器101实现。处理器101可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,媒体播放的加载控制方法的各步骤可以通过处理器101中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器101可以是通用处理器、数字信号处理器(dsp,digitalsignalprocessor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。处理器101可以实现或者执行本公开实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本公开实施例所公开的方法的步骤,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于存储介质中,该存储介质位于存储器102,处理器101读取存储器102中的信息,结合其硬件完成本公开实施例提供的媒体播放的加载控制方法的步骤。

下面说明媒体播放的加载控制装置的纯硬件实施,实现本公开实施例媒体播放的加载控制装置可以被一个或多个应用专用集成电路(asic,applicationspecificintegratedcircuit)、数字信号处理(dsp,digitalsignalprocessing)、可编程逻辑器件(pld,programmablelogicdevice)、复杂可编程逻辑器件(cpld,complexprogrammablelogicdevice)、现场可编程门阵列(fpga,field-programmablegatearray)或其他电子元件实现,用于执行实现本公开实施例提供的媒体播放的加载控制方法。

下面说明媒体播放的加载控制装置的纯软件实施,实现本公开实施例媒体播放的加载控制装置可以为应用程序或插件,或者采用二者结合的方式实现。

作为示例,应用程序可以是专用于进行媒体播放的加载控制的客户端,也可以是将媒体播放的加载控制功能作为可选功能的客户端,通过安装相应的插件实现。

作为示例,插件可以实现为应用程序的功能升级安装包,在用特定应用程序中叠加媒体播放的加载控制的功能;也可以是媒体播放的网页中的元素,采用前端语言实现,通过被网页直接解释执行而在网页中实现媒体播放的加载控制的功能。

接下来对媒体播放的加载控制方法的示例性实施场景进行说明。

作为媒体播放的加载控制的一种实施方式,可以通过内嵌于浏览器的网页的播放器实现,播放器在浏览器的页面中播放媒体文件,在播放器通过浏览器的页面进行播放的过程中,播放器检测到预加载的媒体数据所对应的时长小于固定时长时,播放器从服务器获取使得预加载的媒体数据满足固定时长的媒体数据,然后,播放器通过媒体源扩展接口将获取的媒体数据发送给浏览器的媒体元素(video元素和/或audio元素)进行媒体数据的预加载。

作为媒体播放的加载控制的一种实施方式,还可以通过内嵌于app的网页的播放器实现,该app中嵌入有浏览器内核,播放器在app调用浏览器内核加载的网页中播放媒体文件。以嵌入有浏览器内核的微信客户端为例,用户可通过微信客户端中内嵌的浏览器内核加载媒体文件的播放页面,当播放器检测到预加载的媒体数据所对应的时长小于固定时长时,从服务器获取使得预加载的媒体数据满足固定时长的媒体数据,然后通过媒体源扩展接口将获取的媒体数据发送给微信客户端的媒体元素(video元素和/或audio元素)进行媒体数据的预加载。

在播放器播放媒体文件的过程中,固定时长用于接续播放器的实时的播放点,从而实现媒体文件的连续播放。就播放点而言,可以是通过连续播放媒体文件(也即在用户未加以干预的情况下自然播放)的方式到达的播放时刻,例如从第30分钟开始播放到第40分钟的播放点;也可以是通过跳转的方式(也即用户通过光标点击进度条实现页面跳转)到达媒体文件到达的播放时刻,例如原播放点为播放进度的20%,跳转后的播放点为播放进度的30%,而预加载的媒体数据即为在播放点之后所加载的媒体数据。

接下来以播放器内嵌于网页,网页通过解析、执行播放器的js(javascript)代码实现播放器实例,播放器使用网页的媒体元素播放媒体文件为例,对本公开实施例提供的媒体播放的加载控制方法进行说明。

图6示出了本公开实施例提供的媒体播放的加载控制方法的一个可选的流程示意图,参见图6,本公开实施例提供的媒体播放的加载控制方法涉及步骤201至步骤203,以下分别进行说明。

步骤201:在播放器通过网页播放的过程中,检测播放器预加载的媒体数据所对应的时长。

在一实施例中,可通过如下方式获取预加载的媒体数据所对应的时长:

获取媒体文件实时的播放点对应的时间,以及加载的媒体数据对应的播放结束时间;计算播放结束时间与播放点对应的时间的差值为预加载的媒体数据所对应的时长。

其中,可通过如下方式获取媒体文件实时的播放点对应的时间:以媒体文件的播放开始时间为时间原点,相对于媒体时间坐标系统的时间度量,获取当前的播放点所对应的媒体文件的视频帧所对应的时间,以获取的视频帧的时间为播放点对应的时间。

可通过如下方式获取加载的媒体数据对应的播放结束时间:获取当前预加载的媒体数据的末视频帧所对应的时间,以获取的末视频帧的时间为当前预加载的媒体数据对应的播放结束时间。

步骤202:当预加载的媒体数据所对应的时长小于固定时长时,获取使得预加载的媒体数据满足固定时长的媒体数据。

对固定时长进行说明,在一实施例中,可预先对固定时长进行配置。

示例性地,固定时长在播放器提供可配置的功能,可从播放器的配置信息中,获取配置于播放器中的固定时长;或者,网页侧(业务方)进行固定时长的配置,播放器从网页的配置信息中,获取配置于网页侧的固定时长。在实际实施时,固定时长一次性设置即有效,或者是特定时间段内有效,或者是针对特定媒体文件(如特定类型)有效、或者根据登录用户设置有效。

在一实施例中,固定时长还可以通过播放器自适应得到。

示例性地,播放器确定与网页的网络参数相适配的时长为固定时长。

以网络参数为进行数据传输的下行网络带宽为例,对固定时长的适配进行说明。固定时长越长,固定时长所对应的媒体数据量越大,播放点更新后,从服务器请求获取的媒体数据量也就越多,占用的下行网络带宽也就越大,也即固定时长的长度与下行网络带宽存在正相关关系,因此,为了保证网络的传输性能,播放器可基于当前的下行网络带宽、以及固定时长的长度与下行网络带宽的正相关关系,适配固定时长的长度。

以网络参数为进行数据传输的传输流量为例,对固定时长的适配进行说明。固定时长越长,固定时长所对应的媒体数据量越大,播放点更新后,播放器从服务器请求获取的媒体数据流量也就越大,因此,为了保证网络的传输性能,当前进行媒体数据传输的传输流量越大时,需要将固定时长设置越小,也即传输流量与固定时长的长度存在负相关关系,播放器可基于当前进行数据传输的传输流量、以及传输流量与固定时长的长度的负相关关系确定固定时长的长度。

示例性地,播放器确定与网页的特征参数相适配的时长为固定时长。

以特征参数为网页中播放窗口的数量为例,对固定时长的适配进行说明。网页中播放窗口的数量越多,网页与服务器的数据交互次数越多,网络负载压力越大,因此,为了保证网络性能,当网页中播放窗口的数量较多时,需要将固定时长的长度设置更短,即播放窗口的数量与固定时长的长度存在负相关关系,播放器可基于当前网页中播放窗口的数量、以及播放窗口的数量与固定时长的长度的负相关关系确定固定时长的长度。

当特征参数为网页中播放窗口的数量时,还可进一步基于播放窗口的播放状态进行固定时长的适配,如获取当前处于播放状态(即正在进行媒体播放的加载控制)的播放窗口的数量,基于处于播放状态的播放窗口的数量与固定时长的负相关关系确定固定时长。

接下来对媒体数据的获取进行说明,在实际应用中,媒体数据可包括视频帧和音频帧,当播放一部电影或者一个轨道的时候,播放器必须能够正确的解析数据流,对一定的时间获取对应的媒体数据并确保这一段媒体数据能够被独立解码,在一实施例中,可通过如下方式获取使得预加载的媒体数据满足固定时长的媒体数据:

在媒体文件中定位第一关键帧,第一关键帧的解码时间不晚于当前预加载的媒体数据的播放结束时间;在媒体文件中定位第二关键帧,第二关键帧的解码时间与预加载媒体数据的播放开始时间的差值为固定时长;从媒体文件中提取第一关键帧与第二关键帧之间的媒体数据。也就是说,固定时长的媒体数据是以关键帧为单位进行分割。

接下来对定位第一关键帧及第二关键帧进行说明。以媒体文件为mp4文件为例,播放器可根据从mp4文件中识别出的媒体信息(视频/音频帧的偏移量、容量、解码时间等信息)定位第一关键帧与第二关键帧。播放器当前预加载的视频数据的最后一个视频帧存在普通帧或关键帧两种情况,以下针对这两种情况分别对第一关键帧的定位进行说明。

对于当前预加载的视频数据的最后一个视频帧为关键帧的情况,为了避免出现因为缺少解码数据(即关键帧)而跳帧的情况,第一关键帧的解码时间不晚于预加载的视频数据的播放结束时间,若当前预加载的视频数据的最后一个视频帧为关键帧,则将最后一个视频帧作为第一关键帧,如此,最大程度减少请求多余数据的情况,避免对连接和流量的占用导致网页中非媒体播放业务延迟的情况。

对于当前预加载的视频数据的最后一个视频帧为普通帧的情况,为了避免出现因为缺少解码数据(即关键帧)而跳帧的情况,第一关键帧的解码时间不晚于预加载的视频数据的播放结束时间,因此,需要将该普通帧之前的第一个关键帧(即普通帧之前距普通帧最近的关键帧)作为第一关键帧,也即,将当前预加载的视频数据中的最末一个关键帧作为第一关键帧。如此,能够保证当前预加载的视频数据的最后一个视频帧有足够的信息用于正确解码,不会出现因为缺少解码数据(即关键帧)而跳帧的情况。

接下来对第二关键帧的定位进行说明。在一实施例中,播放器可通过如下方式在mp4文件中定位第二关键帧:确定预加载的媒体数据的播放开始时间,由于固定时长的媒体数据是以关键帧为单位进行分割,播放开始时间也即首个关键帧所对应的解码时间,将mp4文件中解码时间与播放开始时间的差值为固定时长的关键帧作为第二关键帧;若mp4文件中解码时间与播放开始时间的差值为固定时长的视频帧为普通帧,为了避免出现跳帧的情况,将该普通帧之后的首个关键帧作为第二关键帧。

接下来对播放器从媒体文件中识别媒体信息进行说明。在一实施例中,播放器可通过如下方式从媒体文件中识别出媒体信息:根据设定的偏移量和容量,向服务器请求对应设定的偏移量和容量的媒体文件中的数据(即请求固定容量的数据),从服务器返回的数据中识别出元数据容器中的元数据,解析识别出的元数据,得到用于描述媒体文件的媒体数据容器中封装的媒体数据的媒体信息。

其中,设定的容量可以是根据已有的媒体文件的文件类型容器和元数据容器的容量统计得到,使得设定的容量能够覆盖设定比例(如全部)媒体文件的文件类型容器和元数据容器的容量的加和,确保当媒体文件的封装结构为顺序封装的文件类型容器、元数据容器和媒体数据容器时,能够通过一次请求得到完整的元数据容器中所封装的元数据,节约了网络传输时对连接的占用情况,进而避免了因为连接占用导致网页中非媒体播放业务因为无法使用连接而延迟响应的情况。

以媒体文件为mp4文件为例,播放器获取的元数据容器中封装的元数据即为mp4文件中的moovbox中封装的二进制数据,当mp4文件的封装结构为顺序封装的fytpbox、moovbox和mdatbox时,设定容量可以是根据已有mp4文件的ftypbox和moovbox容量统计得到,使设定容量能够覆盖设定比例(如全部)mp4文件的ftypbox和moovbox的二进制数据的加和,确保多数情况下一次即可从服务器请求到moovbox中包括完整的二进制数据。

在一实施例中,播放器通过设定的偏移量及容量从服务器请求到的二进制数据中,从零字节开始的一段二进制数据是对应文件类型容器的,播放器通过读取容器头部得到文件类型容器的容量,通过读取第二个容器的头部得知下一个容器的类型及容量,当第二个容器的类型为元数据容器,且返回的二进制数据的容量不小于文件类型容器的容量及元数据容器容量的加和时,表明通过设定的偏移量及容量从服务器请求到的二进制数据中包含了元数据容器中封装的元数据;当第二个容器的类型为元数据容器,且返回的二进制数据的容量小于文件类型容器的容量及元数据容器容量的加和时,表明通过设定的偏移量及容量从服务器请求到的二进制数据中未包含元数据容器中封装的元数据。当播放器通过设定的偏移量及容量从服务器请求到的二进制数据未包含完整的元数据容器中的元数据时,播放器需要从服务器所返回的二进制数据中读取容器的容量,根据元数据容器的头部计算元数据容器的偏移量及容量,将计算得到的偏移量及容量携带在网络请求中以向服务器请求元数据,由服务器根据请求,从媒体文件中所计算得到的偏移量开始读取二进制数据、且读取的二进制数据符合计算得到的容量,向播放器返回数据。

举例说明,播放器从服务器所返回的二进制数据中读取容器的容量,根据元数据容器的头部计算元数据容器的偏移量及容量,涉及如下两种情况:

情况1)当从剩余的二进制数据(即返回的二进制数据中除文件类型容器的二进制数据之外的数据)读取的容器的类型为元数据容器,且剩余的二进制数据的容量小于元数据容器的容量时,计算元数据容器的容量与剩余二进制数据容量的差值作为二次请求的新的容量,以首次请求的偏移量和容量的加和作为新的偏移量,向服务器第二次请求二进制数据;

情况2)当从剩余的二进制数据读取的容器的类型为媒体数据容器时,计算媒体数据容器的容量与文件类型容器容量的加和为二次请求的新偏移量,以设定的容量(可以为能够覆盖元数据容器的容量的经验值)向服务器第二次请求二进制数据。

以媒体文件为mp4文件为例,播放器通过设定的偏移量及容量从服务器请求到的二进制数据未包含完整的moovbox的二进制数据,此时,播放器需要从服务器所返回的二进制数据中读取容器的类型和容量,确定moovbox在mp4文件中的偏移量和容量;

mp4文件的二进制数据,起始的字节总是对应ftypbox,从返回的二进制数据中识别出fytpbox的二进制数据,根据ftypbox的头部可以获知其长度,从而从剩余的二进制数据中,根据头部的规范长度读取下一个box的二进制数据,根据头部表示的容器类型,包括以下几种情况:

1)当从剩余的二进制数据(即返回的二进制数据中除fytpbox的二进制数据之外的数据)读取的容器的类型为moovbox,且剩余的二进制数据的容量不小于moovbox的容量时,根据所确定的偏移量和容量,从服务器获取mp4文件中以moovbox在mp4文件中的偏移量开始、且符合moovbox在mp4文件中的容量的moov数据;

2)当从剩余的二进制数据读取的容器的类型为moovbox,且剩余的二进制数据的容量小于moovbox的容量时,计算moovbox的容量与剩余二进制数据容量的差值作为二次请求的新的容量,以首次请求的偏移量和容量的加和作为二次请求的新的偏移量,向服务器第二次请求二进制数据;

3)当从剩余的二进制数据读取的容器的类型为mdatbox时,计算mdatbox的容量与ftypbox容量的加和作为二次请求的新偏移量,以设定的容量向服务器第二次请求二进制数据。

如此,无论媒体文件为何种封装结构,即无论媒体文件中文件类型容器、元数据容器和媒体数据容器的封装顺序如何,均能够保证播放器最多两次请求便可从服务器处得到元数据容器中的元数据,提高了元数据的获取效率。

举例说明,对于mp4文件,服务器返回的二进制数据,根据mp4文件的封装规范,从零字节开始的一段二进制数据是对应ftypbox的,而根据box的的头部的封装规范,可以从ftypbox的头部读取ftypbox的容量(即长度)以及完整的mp4文件的容量;假设ftypbox的容量为a(单位为字节),则从a+1开始读取后续容器的头部信息,获取后续容器的类型和容量,如果通过读取得到ftypbox后续的是moovbox,且剩余的二进制数据的容量(设定容量-ftypbox的容量)大于moovbox的容量,说明已经取回了moovbox的完整二进制数据,可以根据moovbox的偏移量及容量从剩余的二进制数据中提取moovbox中的元数据。

播放器从服务器处获取元数据容器中封装的元数据后,解析元数据容器中子容器的嵌套结构,根据子容器的嵌套结构读取出各子容器中的二进制数据;从所读取出的二进制数据解析出各子容器表征的媒体数据的媒体信息。在实际应用中,媒体信息可以包括媒体文件中视频帧和/或音频帧的偏移量、容量、解码时间等信息。

以媒体文件为mp4文件为例,元数据容器即为moovbox,参见图2,可知,moovbox中封装有mvhdbox和trackbox,其中,通过解析mvhdbox的二进制数据,可以得到mp4文件的创建时间、修改时间、时间度量标尺、可播放时长、默认音量等信息;moovbox中包括多个trackbox,记录了每个媒体轨道所特有的描述信息,如对于视频轨道videotrackbox,videotrackbox中多层嵌套了多个子容器,基于videotrackbox的嵌套结构,解析相应的二进制数据得到mp4文件的视频帧信息、以及所对应的画面信息。

在一个实施例中,播放器可通过如下方式对获取的元数据进行解析,得到媒体信息:顺序解析元数据容器二进制数据中对应容器头部的规范长度的二进制数据,得到所述元数据容器中子容器的容器类型、以及所述子容器的容器数据的长度;调用与所述子容器的容器类型相应类型的解析器,顺序解析未解析的数据中与所述容器数据的长度相应的二进制数据,得到所述容器数据所表示的媒体信息。

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

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

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

在一个实施例中,对元数据容器中嵌套的典型容器类型进行预标记,用于表示容器是直接用于封装二进制数据还是进一步封装有容器,例如对于图2示出的mvhdbox、audiotrackbox和videotrackbox等标记进一步封装有容器,对于图2示出的sttsbox、stsdbox等标记为直接封装有二进制数据。

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

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

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

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

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

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

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

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

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

基于上述对媒体信息识别的说明,接下来对播放器根据识别出的媒体信息获取第一关键帧和第二关键帧之间的媒体数据进行说明。播放器在定位第一关键帧和第二关键帧之后,在一实施例中,可通过如下方式从媒体文件中提取第一关键帧与第二关键帧之间的媒体数据:基于第一关键帧及第二关键帧之间的视频帧在媒体文件中的偏移量和容量、以及,与视频帧对齐的音频帧在媒体文件中的偏移量和容量,确定目标区间的偏移量和容量;其中,目标区间包括上述视频帧和音频帧;根据所确定的偏移量及容量,确定包括上述视频帧和音频帧的目标区间(由最小偏移量和最大容量构成的区间)的偏移量及容量;基于目标区间的偏移量和容量,从媒体文件的媒体数据容器中提取相应的媒体数据。

这里,对本公开实施例中的音频帧与视频帧的对齐方式进行说明:以视频帧为基准,根据媒体数据的起始时间和时长,在视频帧定位时间同步的音频帧,保证媒体数据中第一个音频帧的解码起始时间不晚于视频帧的解码起始时间,最后一个音频帧的解码时间不早于视频帧的解码结束时间,如此,可避免在进行媒体文件(如视频)播放时出现有画面没声音的情况,而多取回的音频帧可以在播放后续对应的视频帧时解码使用。

对确定目标区间的偏移量和容量进行说明:通过两个关键帧中第一关键帧及第二关键帧之间的视频帧在媒体文件中的偏移量和容量,定位视频帧在元数据容器中的位置,通过与视频帧对齐的音频帧在媒体文件中的偏移量和容量,定位音频帧在元数据容器中的位置,取位置的上限和下限构成的区间为目标区间,即由最小偏移量和最大容量构成的区间;其中,位置的上限对应的偏移量和容量为目标区间的上限对应的偏移量和容量,位置的下限对应的偏移量和容量为目标区间的下限对应的偏移量和容量。在实际应用中,目标区间是目标分辨率媒体文件的媒体数据容器中存储视频帧和音频帧的最小区间,例如:第一关键帧和第二关键帧之间的视频帧在目标分辨率媒体文件的位置的偏移量,对应区间为[a,b](地址为升序),音频帧在目标分辨率媒体文件的位置的偏移量,对应区间为[c,d](地址为升序),那么,取位置的上限和下限构成的区间即为[min(a,c),max(b,d)]。如此,播放器发送携带目标区间的偏移量和容量的网络请求给服务器,以请求目标区间的媒体数据,服务器基于目标区间的偏移量和容量提取媒体文件中的媒体数据后一次性的返回目标区间的媒体数据,无须二次获取,减少了播放器的请求次数,提高了处理效率。

步骤203:通过媒体源扩展接口,将获取的媒体数据发送给内嵌播放器的网页的媒体元素进行预加载。

在一实施例中,当播放的媒体文件为支持流媒体播放的流媒体格式的文件时,可通过如下方式实现将获取的媒体数据发送给内嵌播放器的网页的媒体元素进行预加载:

将获取的媒体数据添加到媒体资源扩展(mse,mediasourceextensions)接口中的媒体源(mediasource)对象;调用mse创建对应媒体源对象的虚拟地址;向媒体元素(video元素、audio元素)传递虚拟地址,虚拟地址用于供媒体元素以媒体源对象为数据源进行预加载。

在一实施例中,播放器播放的媒体文件采用非流媒体格式,如mp4/mkv/wmv/asf等封装格式,播放器需要将获取的满足固定时长的媒体数据构造成分段媒体文件,然后再将分段媒体文件添加到mse中的媒体源对象,调用mse创建对应媒体源对象的虚拟地址;向媒体元素(video元素、audio元素)传递虚拟地址,虚拟地址用于供媒体元素以媒体源对象为数据源进行预加载。

这里,对播放器基于获取的使得预加载的媒体数据满足固定时长的媒体数据构造分段媒体文件进行说明。在一实施例中,播放器可通过如下方式构造分段媒体文件:播放器基于识别得到的媒体信息计算分段媒体文件级别的元数据,将计算得到的元数据以及所获取的媒体数据,基于分段媒体文件的封装格式进行填充,得到对应的分段媒体文件。

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

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

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

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

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

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

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

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

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

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

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

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

参见图8,图8是本公开实施例提供的播放器通过网页的媒体源扩展接口将分段媒体文件发送给媒体元素进行预加载的一个可选的示意图,当播放器在网页中播放窗口(播放器对应播放窗口)接收到媒体文件的播放事件时,mse通过执行mediasource方法创建媒体源(mediasource)对象;执行媒体源扩展接口中封装的addsourcebuffer方法创建mediasource对象的缓存,即源缓存(sourcebuffer)对象,一个mediasource对象拥有一个或多个sourcebuffer对象,每个sourcebuffer对象可以用于对应网页中的一个播放窗口,用于接收窗口中待播放的分段媒体文件。在媒体文件的播放过程中,播放器中的解析器(parser)通过解析新获取的媒体数据,不断构造新的分段媒体文件,通过执行sourcebuffer对象的appendbuffer方法,添加分段媒体文件到同一个mediasource对象的sourcebuffer对象,实现对媒体文件中媒体数据的预加载。

播放器将所构造的分段媒体文件添加到媒体资源扩展接口中的媒体源对象之后,调用媒体资源扩展接口创建对应媒体源对象的虚拟地址,虚拟地址用于供媒体元素以媒体源对象为数据源进行数据加载及播放。例如,播放器执行媒体源扩展接口中封装的createobjecturl方法,创建对应媒体源对象的虚拟地址,即虚拟统一资源定位符(url,uniformresourcelocator),其中封装有blob类型的分段媒体文件。此外,播放器将mediasource对象设置为虚拟url的源(src)属性,也就是将虚拟url与网页中的媒体元素如video/audio元素绑定,这个过程也称为将媒体源对象关联到网页中的媒体元素。

图9为本公开实施例提供的播放器通过媒体源扩展接口将分段媒体文件发送给媒体元素的流程示意图,参见图9,播放器基于媒体文件的真实地址(图中http://www.toutiao.com/a/b.mp4)获取满足固定时长的媒体数据,然后基于获取的媒体数据构造分段媒体文件,即将其转换为分段mp4格式的媒体文件,然后将分段媒体文件添加到mse的媒体源对象(例如采用类文件对象(blob)的方式实现),mse创建对应媒体源对象的虚拟url,并向video元素传递该虚拟url,以使video元素获取相应的媒体源对象,实现上述满足固定时长的媒体数据的预加载。

在一实施例中,对于预加载的媒体数据的显示,在网页中对应媒体文件的的播放窗口中,可采用差异化显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段。例如采用不同的颜色显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段。图10为本公开实施例提供的差异化显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段的示意图,在图10中,采用了粗细不同的分段指示线条区分了已播放的媒体数据、预加载的媒体数据及未预加载的媒体数据,如图10中标号21所示为当前播放窗口中已播放的媒体数据分段,标号22为当前播放窗口中预加载的媒体数据分段,标号23为当前播放窗口中未预加载的媒体数据分段,其中,由于预加载的媒体数据所对应的时长为固定时长,也即在当前的播放窗口中,标号22所示的分段长度始终固定,如此,当用户仅想对媒体文件进行浏览,如通过手动切换播放点浏览媒体文件时,由于播放器不会基于当前的播放点预加载未播放的所有媒体数据,而是固定的预加载部分媒体数据,在保证用户观看体验的同时,降低了用户的流量消耗。

接下来以播放器内嵌于网页,播放器使用网页的html5媒体元素播放mp4文件为例,对本公开实施例的媒体播放的加载控制方法进行说明。图11示出了本公开实施例提供的媒体播放的加载控制方法的一个可选的流程示意图,参见图11,本公开实施例提供的媒体播放的加载控制方法包括:

步骤401:播放器根据设定的偏移量和容量,向服务器请求固定容量的mp4文件中的数据。

播放器通过发送携带设定的偏移量和容量的数据请求给服务器,以获取mp4文件中从零字节开始、且符合设定容量的二进制数据。在一实施例中,媒体文件所采用的容器封装结构包括:顺序封装的文件类型容器、元数据容器和媒体数据容器,对于mp4文件,优选地封装结构包括顺序封装的fytpbox、moovbox和mdatbox。设定容量可以是根据已有mp4文件的ftypbox和moovbox容量统计得到,使设定容量能够覆盖设定比例(如全部)mp4文件的ftypbox和moovbox的加和,确保一次即可从服务器请求完整的moovbox二进制数据。

步骤402:播放器接收服务器返回的数据,并从服务器返回的数据中识别出mp4文件的媒体信息。

mp4文件的媒体信息包括mp4文件中视频/音频帧的偏移量、容量、解码时间等信息。

在一实施例中,播放器可通过如下方式实现mp4文件的媒体信息的识别:从服务器返回的数据中识别出fytpbox的二进制数据,并从剩余的二进制数据中读取容器的类型和容量;当读取的容器的类型为moovbox,且剩余的二进制数据的容量不小于moovbox的容量时,从剩余的二进制数据中解析出媒体信息。这里,对于服务器返回的二进制数据,开始的一段二进制数据必然是对应ftypbox的,根据ftypbox的封装规范,可以读取ftypbox的容量(即长度)以及完整的mp4文件的容量;例如ftypbox的容量a(单位为字节),则从a+1开始读取后续容器的头部信息,获取容器的类型和容量,如果是moovbox,且(设定容量-ftypbox的容量)大于moovbox的容量,说明已经取回了moovbox的完整二进制数据,可以根据封装结构进行解析二进制数据,还原出媒体信息。

在一实施例中,当服务器返回的二进制数据未包括完整的moov数据时,从所获取的二进制数据中读取容器的容量,确定moovbox在mp4文件中的偏移量和容量;根据所确定的偏移量和容量,当从剩余的二进制数据读取的容器的类型为moovbox,且剩余的二进制数据的容量不小于moovbox的容量时,从服务器获取mp4文件中以moovbox在mp4文件中的偏移量开始、且符合moovbox在mp4文件中的容量的moov数据;当从剩余的二进制数据读取的容器的类型为moovbox,且剩余的二进制数据的容量小于moovbox的容量时,计算moovbox的容量与剩余二进制数据容量的差值作为二次请求的新的容量,以首次请求的偏移量和容量的加和作为新的偏移量,向服务器第二次请求二进制数据。

在实际应用中,存在mp4文件的封装结构为顺序封装的fytpbox、mdatbox、moovbox的情况,当从剩余的二进制数据读取的容器的类型为mdatbox时,计算mdatbox的容量与计算moovbox容量的加和为二次请求的新偏移量,以设定的容量向服务器第二次请求二进制数据。

步骤403:在播放器通过网页播放mp4文件的过程中,基于媒体信息检测预加载的媒体数据所对应的时长。

这里的媒体数据包括视频帧及音频帧。

在一实施例中,可通过如下方式获取预加载的媒体数据所对应的时长:

获取媒体文件实时的播放点对应的时间,以及加载的媒体数据对应的播放结束时间;计算播放结束时间与播放点对应的时间的差值为预加载的媒体数据所对应的时长。

步骤404:当预加载的媒体数据所对应的时长小于固定时长时,基于媒体信息向服务器请求使得预加载的媒体数据满足固定时长的媒体数据。

在一实施例中,固定时长具有面向业务方(不同视频平台)配置的属性,业务方若侧重用户体验,则可配置相对较长的固定时长,业务方若侧重降低用户的流量消耗,则可配置相对较短的固定时长。

在一实施例中,固定时长的媒体数据是以关键帧为单位进行分割,可通过如下方式获取使得预加载的媒体数据满足固定时长的媒体数据:

根据识别得到的媒体信息,在mp4文件中定位第一关键帧,第一关键帧的解码时间不晚于预加载的媒体数据的播放结束时间;在mp4文件中定位第二关键帧,第二关键帧的解码时间与预加载媒体数据的播放开始时间的差值为固定时长;从mp4文件中提取第一关键帧与第二关键帧之间的媒体数据。

步骤405:基于所获取的媒体数据构造分段媒体文件。

在一实施例中,可通过如下方式构造分段媒体文件:

基于识别得到的媒体信息确定描述所获取的媒体数据的元数据,将确定的元数据及所获取的媒体数据根据分段媒体文件的容器结构进行封装,得到对应的分段媒体文件。

步骤406:将构造的分段媒体文件添加到mse中的媒体源对象。

步骤407:向网页的媒体元素传递虚拟地址。

虚拟地址用于供video元素以媒体源对象为数据源进行预加载。

步骤408:在网页的播放窗口中,差异化显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段。

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

1、播放器预加载的媒体数据始终为固定时长,实现了对媒体数据的加载控制,能够避免流量的大量消耗和连接的不必要占用。

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

3、网页的video元素和audio元素基于虚拟地址,实现了对mp4文件的真实地址的保护。

4、差异化显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段,实现了播放mp4文件过程中对不同阶段的媒体数据显示的提示。

接下来继续对媒体播放的加载控制装置进行说明,在实际实施时,媒体播放的加载控制装置还可以采用软件实施的方式,作为媒体播放的加载控制装置的软件实施示例,图12为本公开实施例提供的媒体播放的加载控制装置的组成结构示意图,参见图12,媒体播放的加载控制装置900包括:

检测单元91,用于在内嵌于网页的播放器播放的过程中,检测所述播放器预加载的媒体数据所对应的时长;

获取单元92,用于当所述预加载的媒体数据所对应的时长小于固定时长时,从服务器获取使得预加载的媒体数据满足所述固定时长的媒体数据;

发送单元93,用于通过媒体源扩展接口,将获取的所述媒体数据发送给所述网页的媒体元素进行预加载。

在一实施例中,媒体播放的加载控制装置还可以包括:

第一确定单元,用于确定与所述网页的网络参数相适配的时长为所述固定时长。

在一实施例中,所述第一确定单元,还用于基于媒体数据传输的下行网络带宽与预加载媒体数据量的正相关关系,确定所述播放器能够预加载的媒体数据量;

确定所述能够预加载的媒体数据量的播放时长为所述固定时长。

在一实施例中,还包括:

第二确定单元,用于确定与所述网页的特征参数相适配的时长为所述固定时长。

在一实施例中,所述第二确定单元,还用于获取所述网页中播放窗口的数量;

基于播放窗口的数量与所述固定时长的负相关关系,确定所述固定时长。

在一实施例中,所述获取单元,还用于在媒体文件中定位第一关键帧,所述第一关键帧的解码时间不晚于所述预加载的媒体数据的播放结束时间;

在所述媒体文件中定位第二关键帧,所述第二关键帧的解码时间与预加载媒体数据的播放开始时间的差值为所述固定时长;

从所述媒体文件中提取所述第一关键帧与所述第二关键帧之间的媒体数据。

在一实施例中,所述获取单元,还用于基于所述第一关键帧及所述第二关键帧之间的视频帧在媒体文件中的偏移量和容量、以及,与所述视频帧对齐的音频帧在所述媒体文件中的偏移量和容量,确定目标区间的偏移量和容量;

其中,所述目标区间包括所述视频帧和所述音频帧;

基于所述目标区间的偏移量和容量,从所述媒体文件的媒体数据容器中提取相应的媒体数据。

在一实施例中,所述发送单元,还用于将所述媒体数据添加到媒体资源扩展接口中的媒体源对象;

创建对应所述媒体源对象的虚拟地址;

向所述媒体元素传递虚拟地址,所述虚拟地址用于供所述媒体元素以所述媒体源对象为数据源进行播放。

在一实施例中,所述发送单元,还用于当待播放的媒体文件采用运动图像专家组mpeg-4文件格式时,基于所述满足所述固定时长的媒体数据构造分段媒体文件;

通过媒体源扩展接口,将所述分段媒体文件发送给所述媒体元素。

在一实施例中,还包括:

显示单元,用于在所述网页的播放窗口中,差异化显示预加载媒体数据对应的分段及未预加载的媒体数据对应的分段。

本公开实施例还提供了一种可读存储介质,存储介质可以包括:移动存储设备、随机存取存储器(ram,randomaccessmemory)、只读存储器(rom,read-onlymemory)、磁碟或者光盘等各种可以存储程序代码的介质。所述可读存储介质存储有可执行指令;

所述可执行指令,用于被处理器执行时实现上述媒体播放的加载控制方法。

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

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