媒体文件转换方法、装置及存储介质
技术领域
本公开涉及多媒体技术,尤其涉及一种媒体文件转换方法、装置及存储介质。
背景技术
动态图像专家组(MPEG,Moving Picture Experts Group)-4封装格式(本文中简称为MP4格式)是目前广泛使用的容器格式,可以存储多种编码方式的视频数据和音频数据。
然而,MP4封装格式是一种非流媒体格式,采用MP4封装格式的文件(本文中简称MP4文件)不支持以流媒体的(即一边下载一边播放)形式播放,为此,相关技术不得不将MP4文件转换流媒体格式,诸如FLV(Flash Video)、超文本传输协议直播流(HLS,HTTP LiveStreaming)等,从而实现流媒体形式的播放。
然而,相关技术缺乏将MP4文件转换为流媒体格式的分段媒体文件以适应网络传输的有效方式。
发明内容
有鉴于此,本公开实施例提供一种媒体文件转换方法、装置及存储介质,能够将非流媒体格式的媒体文件转换为适应网络传输的、能够独立解码的、更小体积的分段媒体文件。
本公开实施例的技术方案是这样实现的:
本公开实施例提供了一种媒体文件转换方法,包括:解析媒体文件的元数据容器中封装的元数据,得到用于描述所述媒体文件的媒体数据容器中封装的媒体数据的媒体信息,所述媒体文件采用非流媒体格式;根据所述媒体信息表示的所述媒体数据的时间,查找给定时段的媒体数据;根据所述媒体信息表示的所述媒体数据在所述媒体文件中的位置,查找所述给定时段的媒体数据在所述媒体文件中的位置;从所述媒体文件的媒体数据容器中提取对应所述位置的媒体数据;将所提取的媒体数据、以及描述所述媒体数据的元数据根据分段媒体文件的封装结构进行封装,得到能够用于独立解码的分段媒体文件。
本公开实施例还提供了一种媒体文件转换装置,包括:解析模块,用于解析媒体文件的元数据容器中封装的元数据,得到用于描述所述媒体文件的媒体数据容器中封装的媒体数据的媒体信息,所述媒体文件采用非流媒体格式;查找模块,根据所述媒体信息表示的所述媒体数据的时间,查找给定时段的媒体数据;所述查找模块,用于根据所述媒体信息表示的所述媒体数据在所述媒体文件中的位置,查找所述给定时段的媒体数据在所述媒体文件中的位置;提取模块,用于从所述媒体文件的媒体数据容器中提取对应所述位置的媒体数据;合成模块,用于将所提取的媒体数据、以及描述所述媒体数据的元数据根据分段媒体文件的封装结构进行封装,得到能够用于独立解码的分段媒体文件。
又一方面,本公开实施例还提供了一种媒体文件转换装置,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令实现本公开实施例提供的媒体文件转换方法。
又一方面,本公开实施例还提供了一种存储介质,存储有可执行指令,所述可执行指令被执行时,用于实现本公开实施例提供的媒体文件转换方法。
又一方面,本公开实施例还提供了一种存储介质,存储有可执行指令,所述可执行指令被执行时,用于实现本公开实施例提供的媒体文件转换方法。
本公开实施例具有如下技术效果:
能够从媒体文件中提取任意给定时段的媒体数据以构造分段媒体文件,从而,当需要播放媒体文件的给定时段时,只需要从非流媒体格式的媒体文件提取给定时间的媒体数据,封装为可独立解码的分段媒体文件即可,通过这种方式,一方面,克服了非流媒体格式文件需要完整下载后才可以独立播放的限制,播放实时性好;另一方面,由于仅需要针对给定时段构造分段媒体文件,而不是将完整的媒体文件预先转换为流媒体格式,转换延迟小因此不需要预先存储,除了原始的媒体文件不会占用额外的存储空间,显著降低了对存储空间的占用。
附图说明
图1是本公开实施例提供的用于多媒体文件封装的容器的一个可选结构示意图;
图2是本公开实施例中MP4文件的一个可选的封装结构示意图;
图3是本公开实施例中媒体文件中的媒体数据容器存储媒体数据的一个可选的结构示意图;
图4是本公开实施例中FMP4文件的一个可选的封装结构示意图;
图5是本公开实施例提供的媒体文件转换装置的一个可选的结构示意图;
图6是本公开实施例提供的媒体文件转换装置的一个可选的结构示意图;
图7是本公开实施例提供的媒体文件转换方法的一个可选的流程示意图;
图8是本公开实施例提供的从元数据容器解析得到媒体信息的一个可选的流程示意图;
图9是本公开实施例提供的从媒体文件中查找给定时段的媒体数据的一个可选的流程图;
图10是本公开实施例提供的从媒体文件中查找给定时段的媒体数据的位置的一个可选的流程示意图;
图11是本公开实施例提供的封装分段媒体文件的一个可选的流程示意图。
具体实施方式
为了使本公开的目的、技术方案和优点更加清楚,下面将结合附图对本公开作进一步地详细描述,所描述的实施例不应视为对本公开的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本公开保护的范围。
除非另有定义,本文所使用的所有的技术和科学术语与属于本公开的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述具体的实施例的目的,不是旨在限制本公开。
对本公开进行进一步详细说明之前,对本公开实施例中涉及的名词和术语进行说明,本公开实施例中涉及的名词和术语适用于如下的解释。
1)媒体文件,以容器(Box,也称为盒子)的方式存储进行编码的媒体数据(例如音频数据和视频数据中的至少一种)的文件,其中还包括用以表达媒体信息以保证媒体数据被正确解码的元数据。
例如,采用动态图像专家组(MPEG,Moving Picture Experts Group)-4封装格式封装媒体数据的形成的媒体文件被称为MP4文件。典型地,MP4文件中存储高级视频编码(AVC,Advanced Video Coding,即H.264)或MPEG-4(Part 2)规范编码的视频数据和高级音频编码(AAC,Advanced Audio Co ding)规范编码的音频数据,当然不排除视频和音频的其他编码方式。
2)容器(Box),也称为盒子,由唯一的类型标识符和长度定义的面向对象的构件,参见图1,是本公开实施例提供的容器的一个可选的结构示意图,包括容器头部(BoxHeader)和容器数据(Box Data),其中填充有用于表达各种信息的二进制数据。
容器头部包括容量(size)和类型(type),容量指明了容器在媒体文件中所占用的长度,类型指明了容器的类型,参见图2,是本公开实施例提供的MP4文件的一个可选的封装结构示意图,MP4文件中涉及的基本容器类型包括文件类型容器(ftyp box)、元数据容器(moov box)和媒体数据容器(mdat bo x)。
容器数据部分可以存储具体的数据,此时容器称为“数据容器”,容器数据部分也可以进一步封装其他类型的容器,此时容器称为“容器的容器”。
3)轨道(Track),也称为流(Stream),媒体数据容器中按时间排序的相关的采样(Sample),对于媒体数据来说,轨道表示一个视频帧序列或一个音频帧序列,还可以包括与视频帧序列同步的字幕轨,同一轨道中的一组连续的采样称为块(Chunk)。
4)文件类型容器,媒体文件中用于存储文件的容量(即所占用字节的长度)和类型的容器,如图2所示,文件类型容器记为“ftyp box”,其中存储的二进制数据按照规范的字节长度描述了文件的类型和兼容性。
5)元数据容器,媒体文件中用于存储元数据(即描述媒体数据容器中存储的多媒体数据的数据)的容器,在MP4文件中的元数据容器中存储的二进制数据表达的信息称为媒体信息。
如图2所示,元数据容器的头部采用二进制数据表示容器的类型为“moovbox”,容器数据部分封装用于存储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=0to i-1of delta(j)) (2)
所有偏移量的和是轨道中媒体数据的时长。
stss box记录了媒体文件中的关键帧的序号。
sts box记录了采样与存储采样的块的映射关系,通过表来映射采样的序号和块的序号之间的关系,通过查表可以找到包含指定采样的块。
stco box定义了每个块在轨道中的位置,位置采用在媒体数据容器的起始字节的偏移量、以及相对于所述起始字节的长度(即容量)表示。
stsz box记录了媒体文件中每个采样的容量(即大小)。
6)媒体数据容器,媒体文件中用于存储多媒体数据的容器,例如,在MP4文件中媒体数据容器,如图3所示,采样是媒体数据容器中存储的单位,存储在媒体文件的块中,块和样本的长度可不相同。
7)分段媒体文件,媒体文件经过分割形成的子文件,每个分段媒体文件能够被独立解码。
以MP4文件为例,MP4文件中的媒体数据根据关键帧分割,分割后的媒体数据与对应的元数据封装形成分段MP4(FMP4,Fragmented MP4)文件,每个FMP4文件中的元数据能够保证媒体数据被正确解码。
例如,在将如图2所示的MP4文件转换为多个FMP4文件时,参见图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个或多个这样的分段,每个分段中封装的元数据保证分段中封装的媒体数据能够被独立解码。
8)媒体资源扩展(MSE,Media Source Extensions)接口,在网页中实现的面向播放器的接口,在网页中的加载期间通过浏览器的解释器解释、执行前端编程语言(例如JavaScript)而实现,向播放器提供调用超文本标记语言(HTML)媒体元素(Media Element)的播放媒体流的功能,例如使用视频元素<video>、以及音频元素<audio>来实现视频/音频的播放功能。
9)流媒体格式,把媒体数据封装为流媒体的媒体文件,媒体文件不必完整下载、不需要额外转码,即可被解码播放,即,原生地支持一边下载,一边播放的封装技术。典型的流媒体格式的文件包括:基于HTTP直播流(HLS,HTTP Live Streaming)技术的TS媒体文件分片,FLV(Flash Video)文件等。
10)非流媒体格式,把媒体数据封装为媒体文件、且媒体文件完整下载后才可以被解码播放的封装技术,典型的非流媒体格式的文件包括:MP4文件,视窗媒体视频(WMV,Windows Media Video)文件,高级串流格式(ASF,Advanced Streaming Format)文件等。
需要指出,MP4文件原生不支持流媒体形式的播放,但是通过在线转码后向播放器转码后的媒体流、或者部分下载的MP4文件的缺失部分填充无效的二进制数据(例如,在ftyp容器和moov容器完整下载的情况下,填充mdat容器的缺失部分以无效的二进制数据代替)也能实现一边下载一边播放的技术效果,本文中将这种原生不支持流媒体播放的文件的封装格式都称为非流媒体格式。
首先说明实现本公开实施例的媒体文件转换装置,媒体文件转换装置可以提供为硬件、软件或者软硬件结合的方式。
下面说明媒体文件转换装置的软件硬件结合的实施,参见图5,图5为本公开实施例媒体文件转换装置一个可选的组成示意图,媒体文件转换装置500可以是带有包括带有视频播放功能的移动电话、计算机、数字广播终端、信息收发设备、游戏控制台、平板设备、医疗设备、健身设备、个人数字助理等。图5所示的媒体文件转换装置500包括:至少一个处理器501、存储器502、至少一个网络接口504和用户接口503。媒体文件转换装置500中的各个组件通过总线系统505耦合在一起。可理解,总线系统505用于实现这些组件之间的连接通信。总线系统505除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图6中将各种总线都标为总线系统505。
其中,用户接口503可以包括显示器、键盘、鼠标、轨迹球、点击轮、按键、按钮、触感板或者触摸屏等。
可以理解,存储器502可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(ROM,Read Only Memory)、可编程只读存储器(PROM,Programmable Read-Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read-Only Memory)、电可擦除可编程只读存储器(EEPROM,Electrically Erasable Programmable Read-Only Memory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(RAM,Random AccessMemory),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(SRAM,Static Random Access Memory)、同步静态随机存取存储器(SSRAM,Synchronous Static Random Access Memory)、动态随机存取存储器(DRAM,Dynamic Random Access Memory)、同步动态随机存取存储器(SDRAM,SynchronousDynamic Random Access Memory)。本公开实施例描述的存储器502旨在包括这些和任意其它适合类型的存储器。
本公开实施例中的存储器502包括但不限于:三态内容寻址存储器、静态随机存储器能够存储从服务器所获取的媒体文件数据以支持媒体文件转换装置500的操作。这些数据的示例包括:用于在媒体文件转换装置500上操作的任何计算机程序,如操作系统5021和应用程序5022;各类型媒体文件数据信息等。其中,操作系统5021包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序5022可以包含各种应用程序,例如带有媒体文件转换功能的客户端、或应用程序等。实现本公开实施例媒体文件转换方法的程序可以包含在应用程序5022中。
上述本公开实施例揭示的方法由处理器501实现。处理器501可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,本公开实施例提供的媒体文件转换方法可以通过处理器501中的硬件的集成逻辑电路或者软件形式的操作完成。上述的处理器501可以是通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。处理器501可以实现或者执行本公开实施例中的提供的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本公开实施例所提供的方法的步骤,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于存储介质中,该存储介质位于存储器502,处理器501读取存储器502中的信息,结合其硬件完成媒体文件转换方法。
在示例性实施例中,本公开实施例还提供了一种计算机可读存储介质,例如包括计算机程序的存储器502,上述计算机程序可由媒体文件转换装置500的处理器501执行,以完成的媒体文件转换方法。计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、Flash Memory、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备,如移动电话、计算机、平板设备、个人数字助理等。
下面说明媒体文件转换装置的纯硬件实施,实现本公开实施例媒体文件转换装置可以被一个或多个应用专用集成电路(ASIC,Application Specific IntegratedCircuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)或其他电子元件实现,用于执行实现本公开实施例提供的媒体文件转换方法。
下面说明媒体文件转换装置的纯软件实施,实现本公开实施例媒体文件转换装置可以被应用程序或插件,或者采用二者结合的方式实现。
作为示例,应用程序可以是专用于进行媒体文件转换的客户端,也可以是将媒体文件转换功能作为可选功能的客户端,通过安装相应的插件实现。
作为示例,插件可以实现为应用程序的功能升级安装包,在用于媒体播放的应用程序中叠加媒体文件转换的功能;也可以是媒体播放的网页中的元素,采用前端语言实现,通过被浏览器直接解释执行而在网页中实现媒体文件转换以及媒体播放的功能。
作为媒体文件转换装置的硬件实施或软件实施的示例,媒体文件转换装置可以提供为一系列在信号/信息/数据层面存在耦合关系的模块,下面将结合图6进行说明,参见图6,图6为本公开实施例媒体文件转换装置一个可选的组成示意图,示出了实现媒体文件转换装置包括的一系列模块,但是媒体文件转换装置的模块结构不仅限于图6所示,例如,可以对其中的模块根据所实现的不同功能而进一步拆分或者合并。下面对图6所示的模块实现的功能进行说明。
下文继续根据图5说明图6示出的各个模块的功能。
解析模块601,用于解析媒体文件的元数据容器中封装的元数据,得到用于描述媒体文件的媒体数据容器中封装的媒体数据的媒体信息,媒体文件采用非流媒体格式。
在本公开的一个实施例中,解析模块601,用于解析元数据容器中子容器的嵌套结构,根据嵌套结构读取出各子容器中的二进制数据;解析模块601,用于从所读取出的二进制数据解析出各子容器表征的媒体数据的媒体信息。结合图2所示的结构,由于容器可以为嵌套结构,因此,首先对元数据容器中子容器的嵌套结构进行解析,从mdat容器中解析出相应的二进制数据。通过本实施例所示的技术方案,可以实现对嵌套结构的元数据容器的解析和相关数据的获取。
查找模块602,根据媒体信息表示的媒体数据的时间,查找给定时段的媒体数据。
在本公开的一个实施例中,查找模块602,用于根据媒体数据的时间查找媒体文件中的两个关键帧,两个关键帧对应给定时段的起始时间和结束时间;查找模块602,用于根据媒体数据的时间查找与两个关键帧之间的视频帧对齐的音频帧;查找模块602,用于根据媒体数据的位置,查找两个关键帧之间的视频帧在媒体文件中的位置,并查找音频帧在媒体文件中的位置。合图2所示的结构,通过本实施例所示的技术方案,可以实现通过对嵌套结构中的视频帧的确定,并实现对audio track容器中相应音频帧位置的定位。
查找模块602,用于根据媒体信息表示的媒体数据在媒体文件中的位置,查找给定时段的媒体数据在媒体文件中的位置。
在本公开的一个实施例中,查找模块602,还用于根据媒体数据的时间,查找解码时间对齐给定时段的起始时间的第一关键帧;查找模块602,还用于查找解码时间早于给定时段的起始时间的关键帧中距离起始时间最近的第一关键帧;查找模块602,还用于根据媒体数据的时间,查找解码时间对齐给定时段的结束时间的第二关键帧;查找模块602,还用于查找解码时间晚于给定时段的结束时间的关键帧中距离结束时间最近的第二关键帧。
在本公开的一个实施例中,查找模块602,还用于根据媒体数据的时间,查找解码时间处于给定时段的音频帧;
末音频帧的解码时间对齐给定时段的结束时间,或者,晚于给定时段的结束时间且距离结束时间最近。通过本实施例所示的技术方案,可以实现根据媒体数据的时间,查找解码时间处于给定时段的音频帧,由于首音频帧的解码时间对齐给定时段的开始时间,或者,首音频帧的解码时间早于给定时段的开始时间且距离开始时间最近,因此,所形成的分段媒体文件克服了MP4文件中可能出现的视频、音频时长不一致的问题,保证每帧视频播放时会有同步的音频播放,不会出现无声的现象,提升了用户的使用体验。
提取模块603,用于从媒体文件的媒体数据容器中提取对应位置的媒体数据。
在本公开的一个实施例中,提取模块603,用于根据两个关键帧之间的视频帧的位置对应的偏移量和容量,以及与视频帧对齐的音频帧的位置对应的偏移量和容量,确定由最小偏移量和最大容量构成的区间;提取模块603,用于从媒体文件的媒体数据容器的相应区间内提取媒体数据。通过本实施例所示的技术方案,通过确定由最小偏移量和最大容量构成的区间;从媒体文件的媒体数据容器的相应区间内提取媒体数据,避免了对媒体数据的二次提取,有效提升了对媒体数据的处理效率。
在本公开的一个实施例中,偏移量表征媒体数据在媒体文件的媒体数据容器中的存储起始位置,容量表征媒体数据从存储起始位置开始占用的长度。
在本公开的一个实施例中,提取模块603,用于根据视频帧的保存位置,对视频帧进行提取,在视频帧提取完成后,根据音频帧的保存位置对音频帧进行提取。
在本公开的一个实施例中,提取模块603,用于根据预设的取断值,在媒体数据中对视频帧和音频帧进行提取。通过本实施例所示的技术方案,可以实现通过一次提取获得相应的音频帧和视频帧,以提升对媒体文件的处理速度。
合成模块604,用于将所提取的媒体数据、以及描述媒体数据的元数据根据分段媒体文件的封装结构进行封装,得到能够用于独立解码的分段媒体文件。
在本公开的一个实施例中,合成模块604,用于将表示媒体文件的类型和兼容性的数据,执行填充操作以填充到段媒体文件的文件类型容器中;合成模块604,用于将表示媒体文件的文件级别的元数据,填充到分段媒体文件的元数据容器中;合成模块604,用于将所提取的媒体数据、以及描述媒体数据的元数据,对应填充到分段媒体文件的分段容器中的媒体数据容器、以及分段级别的元数据容器。结合图4所示的结构,合成模块604,用于将表示媒体文件的类型和兼容性的数据填充到moov容器中,将表示媒体文件的文件级别的元数据填充到moof容器中,将所提取的媒体数据、以及描述媒体数据的元数据填充到mdat容器中。通过本实施例所示的技术方案,通过对媒体数据的封装与填充,可以获得完整的能够用于独立解码的分段媒体文件。
在本公开的一个实施例中,合成模块604,还用于在分段媒体文件的子容器对应的装置中,调用类的写操作功能以完子容器与具有嵌套关系的子容器的合并。
在本公开的一个实施例中,合成模块604,还用于调用类的写操作功能在子容器的内存缓冲区完成二进制数据的写入和合并,以及,返回类的实例,所返回的实例用于合并子容器与具有嵌套关系的子容器的合并。
在本公开的一个实施例中,合成模块604,还用于通过类Stream提供一个内存缓冲区,用来保存写入的二进制数据;通过Stream提供的静态方法,转换待填充的多字节十进制数据到二进制数据;通过每类Stream的实例提供的写操作功能,在内存缓冲区完成待填充到子容器的二进制数据的合并;方法返回一个新的Stream实例,通过本实施例所示的技术方案,可以实现当前子容器与其他具有嵌套关系的子容器的合并,以灵活实现对子容器的调整。
在本公开的一个实施例中,解析媒体文件的元数据容器中封装的元数据之前还包括请求媒体文件的元数据,当请求原分辨率媒体文件或目标分辨率媒体文件的元数据时,首先检查所请求的缓存是否曾经请求过,如果是则继续请求媒体数据,不重复请求元数据,通过本实施例所示的技术方案,可以利用已经请求的媒体数据,节省数据获取的时间,提升操作速度。
在本公开的一个实施例中,合成模块604,还用于根据元数据容器在媒体文件中的位置,从媒体文件的二进制数据中获取对应元数据容器的二进制数据;顺序解析所获取的二进制数据中对应元数据容器头部的规范长度的二进制数据,得到元数据容器中子容器的容器类型、以及子容器的容器数据的长度;调用与子容器的容器类型相应类型的解析器,顺序解析未解析的数据中与容器数据的长度相应的二进制数据,得到容器数据所表示的媒体信息。
在本公开的一个实施例中,对播放器获取给定时段内媒体数据的流程进行说明。当通过内嵌于网页的播放器播放一部视频文件或者一个轨道的媒体文件的时,播放器必须能够正确的解析数据流,并对一定的时间获取对应的媒体数据并确保这一段媒体数据能够被独立解码。
将结合本公开实施例提供的媒体文件转换装置,说明实现本公开实施例的媒体文件转换方法,下文中以媒体文件为MP4文件为例进行说明,可以理解,根据下载记载的针对MP4文件的转换方案可以轻易应用于其他非流媒体格式,诸如MKV、WMV和ASF等其他非流媒体格式的媒体文件。
参见图7,图7为本公开实施例提供的媒体文件转换方法的一个可选的流程示意图,将结合图7示出的步骤进行说明。
步骤701,解析媒体文件的元数据容器中封装的元数据,得到用于描述媒体文件的媒体数据容器中封装的媒体数据的媒体信息。
在本公开的一个实施例中,媒体文件为MP4文件,解析媒体文件的元数据容器中子容器的嵌套结构,根据嵌套结构读取出各子容器中的二进制数据;从所读取出的二进制数据解析出各子容器表征的媒体数据的媒体信息。
结合图2所示的结构,MP4文件的moov容器为嵌套结构,对元数据容器中子容器的嵌套结构进行解析,确定moov容器所嵌套的子容器,例如mvhd容器、音频轨道容器和视频轨道容器等,如果子容器还嵌套有容器则继续解析,直至解析到不再嵌套有容器的子容器时,读取相应的子容器中封装的二进制数据,解析得到二进制数据所表示的媒体消息,例如stss box记录的媒体文件中的关键帧的序号,stsz box记录的媒体文件中每个采样的容量(即大小),等。
在本公开的一个实施例中,提供根据容器类型设置解析器,根据容器类型解析元数据容器中的子容器从而得到媒体信息的方式,将结合图8进行说明。
参见图8,图8是本公开实施例提供的从元数据容器解析得到媒体信息的一个可选的流程示意图,将结合图8示出的步骤进行说明。
步骤801,定位元数据容器在媒体文件中的位置。
在一个实施例中,通过从媒体文件的二进制数据读取符合容器头部规范的二进制数据,根据读取的二进制数据中识别的容器的类型和长度,直至定位元数据容器在媒体文件中的偏移量和容量。
举例来说,对于媒体文件的二进制数据,从零字节起始的二进制数据对应文件类型容器,通过容器头部的规范长度,读取媒体文件的二进制数据的起始位置,读取符合容器头部的规范长度的二进制数据,解析读取的二进制数据可以确定媒体文件中位于文件类型容器之后的容器的类型和长度。
如果解析出的类型是文件类型容器,则可以解析出元数据容器的长度(即容量),此时元数据容器的偏移量为文件类型容器的长度。
如果解析出的类型是媒体数据容器,则根据媒体数据容器的长度和分类型容器的长度为偏移量,继续读取符合容器头部的规范长度的二进制数据,从而可以解析出元数据容器的长度(即容量),此时元数据容器的长度为文件类型容器的长度与媒体数据容器的长度的加和。
媒体文件中除了起始的容器是文件类型容器,后续容器的封装顺序没有规范,通过上述解析方式,不管媒体文件中容器的封装顺序是文件类型容器、元数据容器和媒体数据容器,还是文件类型容器、媒体数据容器和元数据容器,都能够准确高效定位文件类型容器在媒体文件中的位置。
步骤802,根据元数据容器在媒体文件中的位置从媒体文件的二进制数据中获取对应元数据容器的二进制数据。
元数据容器在媒体文件中的位置以偏移量和容量表示,从媒体文件中读取以偏移量对应的位置开始读取二进制数据,直至读取的二进制数据的长度符合元数据容器的容量,从而读取出元数据容器对应的二进制数据。
步骤803,顺序解析元数据容器二进制数据中对应容器头部的规范长度的二进制数据,得到元数据容器中子容器的容器类型、以及子容器的容器数据的长度。
在一个实施例中,针对元数据容器中嵌套多个子容器的情况,每次读取二进制数据的偏移量都是已经识别出子容器长度的加和,所读取的二进制数据的长度符合容器头部的规范长度,从而可以解析出当前所处理子容器的类型和长度。
例如,首次读取时,从元数据容器的二进制数据的零字节开始读取二进制数据,且所读取的二进制数据的长度符合容器头部的规范长度,从而可以解析出第一个子容器的类型和长度;第二次读取时,以首次读取的子容器的长度为偏移量,开始读取二进制数据,且所读取的二进制数据的长度符合容器头部的规范长度,从而可以解析出第二个子容器的类型和长度。
通过上述方式读取二进制数据不会出现多读导致回退的情况,也不会出现及少读而二次读取的情况,解析的效率和正确率得以保证。
步骤804,调用与子容器的容器类型相应类型的解析器,顺序解析未解析的数据中与容器数据的长度相应的二进制数据,得到容器数据所表示的媒体信息。
在一个实施例中,对元数据容器中嵌套的典型容器类型进行预标记,用于表示容器是直接用于封装二进制数据还是进一步封装有容器,例如对于图2示出的mvhd box、audio track box和video track box等标记进一步封装有容器,对于图2示出的stts box、stsd box等标记为直接封装有二进制数据。
对于标记为直接封装二进制数据的容器类型,设置与容器类型一一对应的解析器,解析器用于根据二进制数据解析出所表示的媒体信息;在步骤804中,将在步骤803中解析出的子容器的容器类型与预标记的容器类型比对时,涉及到以下两种情况。
情况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的子容器属性中记录了stsd box、stts box、stsc box等多个嵌套于stbl box的子容器。
在一个实施例中,通过比对确定子容器的容器类型没被预标记、或者被预标记为直接封装二进制数据但是没有调用到相应类型的解析器时,忽略解析子容器对应的二进制数据,根据子容器的长度,跳转到二进制数据中对应下一子容器的部分继续解析。
事实上,媒体文件中会出现自定义的容器类型,通过跳转的方式不会影响元数据容器的整体解析的进度,同时通过设置解析器的方式,当元数据容器的容器类型发生变动时,通过对相应类型的解析器的增加、删除和修改,可以快速实现对最新的元数据容器的兼容解析,具有升级灵活快速的特点。
步骤702,根据媒体信息表示的媒体数据的时间,查找给定时段的媒体数据。
在本公开的一个实施例中,参见图9,图9是本公开实施例提供的从媒体文件中查找给定时段的媒体数据的一个可选的流程图,将结合图9示出的步骤进行说明。
步骤901,根据媒体数据的时间查找媒体文件中的两个关键帧,两个关键帧对应给定时段的起始时间和结束时间。
在本公开的一个实施例中,在根据媒体数据的时间查找媒体文件中的两个关键帧时根据媒体数据的时间,查找解码时间对齐给定时段的起始时间的第一关键帧的序号,或者,查找解码时间早于给定时段的起始时间的关键帧中距离起始时间最近的第一关键帧的序号;根据媒体数据的时间,查找解码时间对齐给定时段的结束时间的第二关键帧的序号,或者,查找解码时间晚于给定时段的结束时间的关键帧中距离结束时间最近的第二关键帧的序号。
例如,媒体文件的时长为120秒,其中包含若干关键帧,当给定时间段为第20至40秒时,根据帧的解码时间与帧的序号的映射关系,首先查找是否有解码时间恰好处于第20秒的关键帧,如果存在,则解码时间恰好处于第20秒的关键帧作为第一关键帧;如果不存在,则查找解码时间早于第20秒、且距离起始时间第20秒最近的一个关键帧作为第一关键帧。
其次,查找是否有解码时间恰好处于第40秒的关键帧,如果存在,则解码时间恰好处于第40秒的关键帧作为第二关键帧;如果不存在,则查找解码时间晚于第40秒、且距离第40秒最近一个关键帧作为第二关键帧。
通过查找视频帧中的关键帧的方式,能够避免起始时间所对应的是普通帧而无法播放所发生跳帧的情况,同时最大程度减少了获取无用的数据,在网络传输时节约流量。
步骤902,根据媒体数据的时间查找与两个关键帧之间的视频帧对齐的音频帧。
在一实施例中,播放器可通过如下方式从媒体数据的时间中查找与给定时段对齐的音频帧:从媒体数据的时间中查找解码时间根据给定时段分布的音频帧,以视频帧为基准,在视频帧定位时间同步的音频帧;其中,当播放点的时间对应存在音频帧时,首音频帧的解码时间对齐给定时段的开始时间;当播放点的时间不存在对应的音频帧时,首音频帧的解码时间早于给定时段的开始时间且距离开始时间最近,保证首音频帧的解码时间不晚于首视频帧(上述第一关键帧)的解码起始时间;当给定时段的结束时间对应存在音频帧时,末音频帧的解码时间对齐给定时段的结束时间;当给定时段的结束时间不存在对应的音频帧时,末音频帧的解码时间晚于给定时段的结束时间且距离结束时间最近,保证末音频帧的解码时间不早于末视频帧(上述第二关键帧)的解码时间。
通过上述查找音频帧的方式,所形成的包括视频帧和相应音频帧的分段媒体文件克服了可能出现的视频、音频时长不一致的问题,保证每帧视频播放时会有同步的音频播放,不会出现无声的现象。
步骤903,根据媒体数据的位置,查找两个关键帧之间的视频帧在媒体文件中的位置,并查找音频帧在媒体文件中的位置。
在一个实施例中,根据步骤703,媒体数据在媒体文件中的位置可以表示为两个区间:第一个区间,即两个关键帧之间的视频帧在媒体文件中的位置,包括在媒体文件的媒体数据容器中的偏移量和容量;第二个区间,即两个音频帧之间的音频帧在媒体文件中的位置,包括在媒体文件的媒体数据容器中的偏移量和容量。其中,偏移量表征媒体数据在媒体文件的媒体数据容器中的存储起始位置,容量表征媒体数据从存储起始位置开始占用的长度。
在另一实施例中,媒体数据在媒体文件中的位置表示为一个区间,根据两个关键帧之间的视频帧的位置对应的偏移量和容量,以及与视频帧对齐的音频帧的位置对应的偏移量和容量,确定由最小偏移量和最大容量构成的区间。
例如,第一关键帧和第二关键帧之间的视频帧在目标分辨率媒体文件的位置的偏移量,对应区间为[a,b](地址为升序),音频帧在目标分辨率媒体文件的位置的偏移量,对应区间为[c,d](地址为升序),那么,取位置的上限和下限构成的区间即为[min(a,c),max(b,d)]。
通过上述的确定一个区间的方式,能够从媒体文件中一次性提取给定时间的媒体数据,减少了播放器的读取次数,提高了处理效率。如此,播放器发送携带目标区间的偏移量和容量的网络请求给服务器,以请求目标区间的媒体数据,服务器基于目标区间的偏移量和容量提取媒体文件中的媒体数据后一次性的返回目标区间的媒体数据,无须二次获取,减少了播放器的请求次数,提高了处理效率。
结合图2所示的结构,通过本实施例所示的技术方案,可以实现通过对嵌套结构中的视频帧的确定,并实现对音频轨道(audio track)容器中相应音频帧位置的定位。
当通过内嵌于网页的播放器播放媒体文件的给定时段时,对于基于给定时段的媒体数据所构造的分段媒体文件时,需要获知部分媒体数据在媒体文件中的位置,包括偏移量和容量,从而能够正确地提取出媒体数据以构造分段媒体文件从而能够正确解码。
步骤703,根据所述媒体信息表示的所述媒体数据在所述媒体文件中的位置,查找所述给定时段的媒体数据在所述媒体文件中的位置。
下面,以媒体文件采用图4示出的封装结构为例,对从媒体文件中查找给定时段的媒体数据在媒体文件中的位置说明,参见图10,图10是本公开实施例提供的从媒体文件中查找给定时段的媒体数据的位置的一个可选的流程示意图,将结合图10示出的步骤进行说明。
步骤1001,确定待获取的媒体数据对应的时段。
时段是接续播放点的一段时间,播放点对应的时间是相对于媒体时间坐标系统(以媒体文件的播放开始时间为时间原点)的时间度量,时段的长度小于媒体文件的长度,例如媒体文件长度的预定比例5%,或者是设定的长度如10分钟。
步骤1002,检查stts box来确定解码时间处于给定时段内的采样(包括视频帧和音频帧)的序号。
例如,对于音频帧,检查stts box来确定解码时间对应给定时段的音频帧的序号;对于视频帧,由于采用压缩算法,给定时段内的首帧如果不是关键帧,还需要根据时间顺序向给定时段的开始时间之前追溯到关键帧,以保证给定时段内的帧能够被解码。
步骤1003,根据采样的序号查询stsc box,确定包括采样的块的序号。
步骤1004,根据块的序号,从stco box中查找块的偏移量。
步骤1005,根据采样的序号查找stsz box,找到采样在块内的偏移量和采样的容量。
在stsz box记录了采样的序号以及容量,将块的偏移量与采样在块内的偏移量累加,得到采样在mdat box中的偏移量。
步骤1006,以偏移量最小的块所对应的偏移量、以及相应采样在块内的偏移量累加,作为给定时段的媒体数据的偏移量。
步骤1007,以偏移量最大的块所对应的偏移量、相应采样在块内的偏移量、以及相应采样的容量累加,作为能够覆盖媒体数据的长度,并与媒体数据的偏移量做差值,得到媒体数据的容量。
对于步骤1006和步骤1007而言,计算给定时段内的音频帧的位置(包括偏移量和容量),以及给定时段内的视频帧的位置(包括偏移量和容量),分别得到视频帧和音频帧在mdat box中存储时占用的区间。
步骤704,从媒体文件的媒体数据容器中提取对应位置的媒体数据。
在本公开的一个实施例中,当媒体文件数据在媒体数据容器的位置使用根据步骤703记载的两个区间表示时,即分别使用视频帧以及音频帧对应的区间表示时,根据视频帧的位置,从媒体数据容器中提取视频帧对应的二进制数据;根据音频帧的位置从媒体数据容器中提取对应的二进制数据。
在本公开的一个实施例中,当媒体文件数据在媒体数据容器的位置使用上述实施例记载的一个区间表示时,从媒体文件的媒体数据容器的相应区间内一次性提取媒体数据,有效提升了对媒体数据的处理效率,尤其在需要网络传输时有显著节约对连接的占用、以及对流量的消耗。
通过本实施例所示的技术方案,可以实现通过一次提取获得相应的音频帧和视频帧,以提升对媒体文件的处理速度。
步骤705,将所提取的媒体数据、以及描述媒体数据的元数据根据分段媒体文件的封装结构进行封装,得到能够用于独立解码的分段媒体文件。
在本公开的一个实施例中,参见图11,图11是本公开实施例提供的封装分段媒体文件的一个可选的流程示意图,将结合图11示出的步骤进行说明。
步骤1101,将表示分段媒体文件的类型和兼容性的数据,填充到分段媒体文件的文件类型容器中。
例如,以封装形成如图4时所示的封装结构的FMP4文件为例,在FMP4文件的文件类型容器即ftyp box的头部填充容器的类型和长度(表示ftypbox的整体长度),在ftyp box的数据部分填充生成表示文件类型为FMP4以及兼容协议的数据(二进制数据)。
步骤1102,将表示分段媒体文件的文件级别的元数据,填充到分段媒体文件的元数据容器中。
在一个实施例中,根据向分段媒体文件的封装结构待填充的媒体数据,根据分段媒体文件中的元数据容器的嵌套结构,计算填充嵌套结构所需要的描述媒体数据的元数据。
仍以图4为例,计算表示FMP4文件的文件级别的元数据,并填充到FMP4的元数据容器(即moov box)中,在moov box中嵌套有mvhd、track和视频扩展(mvex,movie extend)三个容器。
其中,mvhd容器中封装的元数据用于表示与分段媒体文件的播放相关的媒体信息,包括位置、时长、创建时间和修改时间等;track容器中嵌套的子容器表示媒体数据中相应轨道的引用和描述,例如track容器中嵌套有描述轨道的特性和总体信息(如时长、宽高)的容器(记为tkhd box)、记录轨道的媒体信息(比如媒体类型和采样的信息)的容器(记为mdia box)。
步骤1103,将所提取的媒体数据、以及描述媒体数据的元数据,对应填充到分段媒体文件的分段容器中的媒体数据容器、以及分段级别的元数据容器中。
在一个实施例中,分段媒体文件中可以封装有一个或多个分段(fragment),对于待填充的媒体数据而言,可以填充到分段媒体文件的一个或分段的媒体数据容器(即mdatbox)中,每个分段中封装有分段级别的元数据容器(记为moof box),其中填充的元数据用以描述分段中填充的媒体数据,使分段能够被独立解码。
结合图4,以将待填充的媒体数据填充到FMP4文件的封装结构的2个分段中为例,填充到每个分段媒体数据;计算需要填充到相应分段的分段级别的元数据容器(即moofbox)中的元数据,并对应填充到moof box嵌套的子容器中,其中在moof box的头部称为moof box,其中填充的二进制数据用于表示容器的类型为“moof box”以及moof box的长度。
在步骤1101至步骤1103中填充数据到相应容器的一个实施例中,当执行填充操作时,调用类的写操作功能在子容器的内存缓冲区完成二进制数据的写入和合并,以及,返回类的实例,所返回的实例用于合并子容器与具有嵌套关系的子容器的合并。
作为填充数据的一个示例,建立用于实现封装功能的类MP4,将分段媒体文件中的每个子容器封装为类Stream的静态方法;建立用于实现二进制数据操作功能的类Stream,每个类Stream提供有一个内存缓冲区,用来保存待填充的二进制数据;通过Stream提供的静态方法,转换待填充的多字节十进制数据到二进制数据;通过类Stream的实例提供的写操作功能,在内存缓冲区完成待填充到子容器的二进制数据的合并以及填充;Stream提供的静态方法返回一个新的Stream实例,可以实现当前子容器与其他具有嵌套关系的子容器的合并。
通过本公开所提供的媒体文件转换方法,通过解析媒体文件的元数据容器中封装的元数据,得到用于描述所述媒体文件的媒体数据容器中封装的媒体数据的媒体信息,根据所述媒体信息表示的所述媒体数据的时间,查找给定时段的媒体数据;根据所述媒体信息表示的所述媒体数据在所述媒体文件中的位置,查找所述给定时段的媒体数据在所述媒体文件中的位置;从所述媒体文件的媒体数据容器中提取对应所述位置的媒体数据;将所提取的媒体数据、以及描述所述媒体数据的元数据根据分段媒体文件的封装结构进行封装,得到能够用于独立解码的分段媒体文件。能够实现从媒体文件中提取任意给定时段的媒体数据以构造分段媒体文件,从而,当需要播放媒体文件的给定时段时,只需要从非流媒体格式的媒体文件提取给定时间的媒体数据,封装为可独立解码的分段媒体文件即可,由此,克服了非流媒体格式文件需要完整下载后才可以独立播放的限制,播放实时性好;同时由于仅需要针对给定时段构造分段媒体文件,而不是将完整的媒体文件预先转换为流媒体格式,转换延迟小因此不需要预先存储,除了原始的媒体文件不会占用额外的存储空间,显著降低了对存储空间的占用。
以上所述,仅为本公开的较佳实施例而已,并非用于限定本公开的保护范围,凡在本公开的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本公开的保护范围之内。