一种多媒体数据的处理方法 【技术领域】
本发明涉及多媒体数据的处理方法。
背景技术
目前,在网络上处理音视频等多媒体信息主要有下载后处理和流式处理两种方式。为适合上述多媒体信息的流式处理,多媒体数据需要经过压缩和编码,使之变成流式文件格式,在播放时,多媒体文件中的数据以流式方式传输到用户计算机再进行播放,即多媒体文件的数据由音视频服务器向用户计算机连续、实时传送,用户不必等到整个多媒体文件全部下载完毕即可进行播放。播放的同时,文件的剩余部分数据将在后台从服务器内继续下载。为使多媒体文件的数据在网络上边下载边播放,需要将多媒体数据压缩成媒体文件,再编码成流式文件,且在编码时加入一些附加信息,如计时、压缩和版权信息。由于多媒体文件的流式处理方式使多媒体数据播放时的启动延时大大缩短,而且不需要太大的缓存容量,因此是一种较好的多媒体数据的处理方式。
目前处理多媒体数据的流媒体文件格式主要有ASF(微软公司的媒体文件格式)、MP4(MPEG4标准的媒体文件格式)等多种,对于MP4文件格式,参考图1,其中文件地moov域存放mp4文件的头信息,包括媒体数据的编码、解码描述信息,媒体数据的索引信息,媒体数据的封装信息等;mdat存放媒体数据,即通过编码算法压缩的媒体数据。在流媒体播放时,流媒体服务器必须先从磁盘打开媒体文件,然后解析媒体文件的头部分,由于媒体文件的头包含媒体数据索引信息,媒体服务器根据媒体数据索引信息读取媒体数据,然后把媒体数据打包成特定协议数据包,再通过流传输协议在特定的时间发送出去,客户端播放器收到媒体数据进行解码播放。
由于媒体服务器对于每个用户的点播请求,都要重复以上的过程,即解析文件头,从文件头获取封装信息和索引信息,根据索引信息,读取媒体数据,根据封装信息封装媒体数据,通过流传输协议发送出去。按照上述MP4的多媒体数据的处理方式,在播放多媒体文件时,需要频繁地从磁盘系统读取数据,然后根据不同的媒体类型封装成协议数据包,导致媒体服务器处理多媒体数据的效率不理想。
如果采用ASF文件格式处理多媒体数据,参考图2,由于ASF把不同码流的数据都交织放在数据对象(Data Object)中,这样当用户点播一个码流时,媒体服务器需要读取所有码流的数据,而实际只有一个码流的数据是系统需要的,这样由于不同码流的数据包交织在一起,在每次输入输出数据操作时,都会多次读取很多冗余的数据,这必然导致媒体服务器处理多媒体数据的效率的低下。因此,现有的多媒体数据的处理方法尤其不适合大容量多媒体数据的播放。
【发明内容】
为解决上述问题,本发明的目的在于提供一种高效的多媒体数据的处理方法,该方法能适合大容量多媒体数据播放时的速度需求。
为达到上述目的,本发明提供的多媒体数据的处理方法,包括:
将原始媒体数据封装为媒体头文件和媒体体文件,在媒体文件头中存储有流媒体文件信息;在媒体文件体中,存储有流数据块,每个流数据块含有媒体数据包及媒体数据包处理指令;
流媒体播放时,首先通过媒体头文件解析得到流描述信息,然后读取媒体文件体的流数据块中的媒体数据包及其处理指令,根据媒体数据包的处理指令将媒体数据包发送到用户主机播放,直到结束。
在媒体文件体中存储有流数据块具体是指将不同特性的流数据块存储于所述文件体的不同部分。
同一特性的流数据块在媒体文件体中依次排列存储。
所述流数据块的特性具体是指码速率或同一节目源中不同的媒体格式。
所述在媒体文件头中存储的流媒体文件信息包括媒体信息、流信息及流索引信息。
本发明设置下述结构的媒体文件头(HMF Header)用于媒体头文件的封装:
所述媒体文件头,包括至少一个对象(Object),分别用于存储文件信息、媒体信息、流信息、流索引信息;
所述对象包括对象数据域,用于存储对象的具体内容。
所述对象数据域存储的数据类型包括:HMF文件头对象(HMHD)、HMF文件描述对象(HMFD)、HMF文件媒体描述对象(HMMD)、HMF文件流描述对象(HMSD)、流索引表对象(STTB)和扩展信息对象(INFO)。
所述对象还包括:对象标识和对象尺寸域,其中:
对象标识,用于说明对象数据域存储的数据类型;
对象尺寸,用于说明整个对象的大小。
本发明设置下述结构的媒体文件体(HMF Body)用于媒体体文件的封装:
所述媒体文件体包括至少一个流数据块,用于存储流数据;
所述流数据块包括至少一个媒体数据块(Mage),用于分块存储流数据;
所述媒体数据块,包括媒体块头(Mage Header)和媒体块体(MageBody),分别用于存储媒体的管理信息和媒体数据;
所述媒体块头,包括媒体类型、协议类型、播放时间、媒体包数量和指令表域,其中:
媒体类型,用于标识媒体体中存储的数据类型;
协议类型,用于标识传输媒体数据使用的传输协议;
播放时间,用于说明本媒体体数据的播放时间;
媒体包数量,用于说明本媒体体中的媒体数据包的数量;
指令表,用于存储与媒体数据包相对应的媒体数据包的处理指令;
所述媒体块体,包括名称、长度和数据域,用于存储媒体数据包(Packet),其中:
名称,用于存储媒体包的名称;
长度,用于存储媒体报的长度;
数据域,用于存储媒体数据。
上述指令表包括:偏移量、时间戳、指令和标志域,其中:
偏移量,用于指明媒体块体(Mage Body)中数据包(Packet)的位置;
时间戳,用于指明Mage Body中数据包的播放时刻;
指令,用于指明Mage Body中每个数据包的处理方式;
标志,用于标识Mage Body中每个数据包的关键帧等信息。
上述媒体块头还包括版本、媒体体尺寸和媒体头尺寸域,其中:
版本,用于标识媒体体的版本信息;
媒体体尺寸,用于说明媒体体的大小;
媒体头尺寸,用于说明媒体头的大小。
本发明通过下述方法解析媒体头文件得到码流数据块:首先根据流索引表对象(STTB)和用户点播请求的流标识(ID)获取流对应的流描述对象(HMSD),再根据HMSD信息,获取流描述信息,通过流描述信息获取该流对应的媒体数据在文件的偏移量和流关键帧的索引,从而得到码流数据块。
按照下述方法分批、顺序读取该码流数据块中的媒体数据包及其处理指令将媒体数据包发送到用户主机播放:获得播放起始帧的媒体块(Mage)在媒体体文件的偏移量,然后根据上述偏移量读取媒体体文件中对应的多个媒体块(Mage),再根据读取的媒体块的媒体块头(MageHeader),获取媒体块头中的指令表,根据指令表获取媒体数据包(Packet)在Mage中的偏移量(offset),以及该媒体数据包的处理指令(instruction),最后根据上述指令发送预封装的数据包;当发送完多个Mage后,再顺序读取后面的多个Mage,做同样的处理,直到收到用户的停止播放请求或者文件播放结束。
本发明将原始媒体数据封装为媒体头文件和媒体体文件,在媒体文件头中存储有文件信息、媒体信息、流信息、流索引信息;在媒体文件体中,存储依次排列的不同的流数据块,并且每个流数据块含有媒体数据包及媒体数据包处理指令。由于对媒体数据进行预封装时,也同时预封装了媒体数据包的处理指令,即流式传输指令,这样,媒体服务器在进行流式服务时,可以从磁盘直接读取到媒体数据和处理指令,进而可以通过处理指令发送媒体数据包,提高媒体服务器性能。另外,采用本发明提供的数据结构对流媒体数据进行预封装,而且,本发明通过将不同特性的数据块存储于媒体文件体的不同部分,同一特性的数据块依次排列存储,有利于媒体服务器在进行媒体播放时,一次读取多个媒体块(Mage),并根据媒体块头(Mage Header)的指令进行数据发送,这样可以避免媒体播放时读取不需要的媒体数据,从而提高磁盘的吞吐量。
【附图说明】
图1是MP4文件格式图;
图2是ASF文件格式图;
图3是应用本发明的网络示意图;
图4是本发明提供的HMF文件结构图;
图5是图4所述HMF文件头结构图;
图6是媒体块结构图;
图7是媒体块头(Nage Header)结构图;
图8是图7所示结构采用的指令表结构;
图9是本发明的媒体文件在磁盘系统的存储组织示意图;
【具体实施方式】
下面结合附图对本发明作进一步详细的描述。
本发明所述的多媒体数据的处理方法的实质,在于设置一个区别于现有的媒体数据处理方法的数据结构,利用该数据结构进行媒体数据的预封装,同时封装数据包的处理指令,以便在发送媒体数据时,根据预封装的指令完成,从而构造有利于高效处理媒体数据的方法。另:通过本发明可以实现同一文件中可以包含多个流,这些流可以是同一节目的相同编码格式的不同码速率流,也可以是不同的编码格式的流。在此我们以同一节目的相同编码格式的不同码速率流共存的情况为例。应用本发明流式媒体服务网络涉及下述网络组件:媒体制作系统、媒体存储系统、媒体服务系统和媒体播放器。由上述网络组件组成的网络图参考图3。其中:
媒体制作系统,用于把各种媒体数据制作成本发明所述的媒体文件。
媒体存储系统,用于本发明所述的媒体文件存储到磁盘系统,例如使用RAID 5存储文件数据。
媒体服务器,用于接收用户的请求,根据用户的请求读取媒体存储系统的媒体文件,根据媒体文件预封装的指令,把预封装好的媒体数据发送出去。
媒体播放器,用于接收媒体数据,进行解码播放。
首先,媒体制作系统,按照本发明提供的文件格式(HMF文件)将原始媒体数据封装为媒体头文件(*.hmh)和媒体体文件(*.hmd),即,HMF头文件和HMF体文件。具体说,本发明所述的文件格式包括媒体文件头(HMF Header)和媒体文件体(HMF Body)两部分构成,媒体文件头和媒体文件体分别存储在两个不同的文件,参考图4。媒体文件头用于存储文件描述、媒体描述、流描述等必要的信息,媒体文件头包括至少一个对象(Object)数据结构,这些信息存储在各种不同的对象中;媒体文件体中存储全部的预封装的媒体数据。为了提高磁盘吞吐量和处理性能,支持多码速率(MBR),在媒体文件体中,存储依次排列的不同的码流数据块,不同码流速率的媒体数据不交织,而是存放媒体文件体的不同位置,如图4中不同码流的数据按照码流1的数据块、码流2的数据块...等等依次排放。在每个码流数据块中,媒体数据以媒体块(Mage)为基本单位存放。Mage包括媒体块头(Mage Header)和媒体块体(Mage Body)组成,Mage Header包括每个预封装的媒体数据包的处理指令。MageBody包括预封装的媒体数据。
具体说,在媒体文件头中存储有文件信息、媒体信息、流信息、流索引信息;其中:
文件信息,包含有关文件的如大小、创建日期等信息。
媒体信息,包括那些具有相同格式的多个流的公共信息,如流映射表。
流信息,包括每个媒体流的信息,如码速率、媒体格式、在文件体中的位置等。
流索引,包括全部流的索引信息,如媒体格式和码速率信息。
扩展信息,包括如内容简介、版权信息、维护信息、广告等附加的信息。
上述信息存放在媒体文件头的对象(Object)结构中,不同类型信息数据的对象标识(Object_ID)不同,同一类型对象的不同扩充形式以版本号区分。 在整个媒体文件头的对象中,每个对象的基本结构相同,内容不同,存放着不同方面的信息。
上述对象(Object)的基本结构如下表示例所示:域长度(字节)说 明 Object_ID 4标明单元类别:例如:“HMHD”:(HMF Header object)HMF文件头对象“HMFD”:(HMF File Description Object)HMF文件描述对象“HMMD”:(HMF Media Description Object)HMF文件媒体描述对象“HMSD”:(HMF Stream Description Object)HMF文件流描述对象“STTB”:(Stream Table Object)流索引表对象“INFO”:(Information)扩展信息对象Version4对象格式定义的版本标识。Object_Size4对象自身的大小。包括Object_ID、Version、Object_Size和Object Data域的大小的和。ObjectData可变根据对象的具体内容不同,后面部分的长度和格式都是可变的,由各个子对象自己定义。
上表说明,本发明所述的对象结构包括4个域,分别为对象标识(Object_ID)、版本(Version)、对象尺寸(Object_Size)和对象数据(Object Data)域,分别的含义如上表的说明。
在上述示例中,本发明定义了HMHD,HMFD,HMMD,HMSD,STTB,INFO等对象结构,分别用于存放HMF文件的文件信息,媒体信息,流信息,索引信息,扩展信息。存储上述具体信息的媒体文件头结构参考图5。
在媒体文件体中,每个码流的数据块包括多个媒体块(Mage),也可以说每个媒体文件体由很多的Mage组成,Mage由媒体块头(MageHeader)和媒体块体(Mage Body)组成,参考图6。其中的MageHeader主要包括该Mage的信息,以及该Mage不同的媒体数据处理指令。Mage Body主要包括封装好的媒体数据包(Packet)。
具体的Mage Header参考图7。图7所述的Mage Header包括版本(Version)、媒体块尺寸(Mage Size)、媒体块头尺寸(Header Size)、媒体类型(Media Type)、协议类型(Protocol Type)、播放时间(Duration)、媒体包数量(Packet Num)和指令表域。其中:
Version,用于说明媒体块的版本号;
Mage Size,用于说明媒体块的大小;
Header Size,用于说明媒体块头的大小;
Media Type,用于说明媒体体中存储的数据类型;
Protocol Type,用于说明传输媒体数据使用的传输协议;
Duration,用于说明本媒体体数据的播放时间;
Packet Num,用于说明本媒体体中的媒体数据包的数量。
指令表,包括Packet Num个处理指令的指令表。
在图7中,Padding是一个可选项,表示填充位,如果需要,在MageHeader和Mage Body之间可以以0填充空余位。
上述指令表的结构参考图8,指令表的每个表项对应Mage Body的一个预封装好的数据包(Packet)。图8所示的结构包括偏移量(Offset)、时间戳(Time Stamp)、指令(Instruction)和标志(Flags)域,其中:
Offset,用于指明媒体块体(Mage Body)中数据包(Packet)的位置;
Time Stamp,用于指明Mage Body中数据包的播放时刻;
Instruction,用于指明Mage Body中每个数据包的处理方式;
Flags,用于标识Mage Body中每个数据包的关键帧等信息。
媒体块体(Mage Body)包括名称、长度和数据域,其中:
名称,用于存储媒体包(Packet)的名称;
长度,用于存储媒体报的长度;
数据域,用于存储媒体数据。
在Mage Body中,媒体数据包一个接一个的排列在Mage Body中,其位置由Mage Header中的指令表的offset指明。Mage Body包括Packetnum个数据包,每个包的处理由Mage Header的指令表指示。参考下表的说明。名称长度数据Packet 1可变第1个媒体数据包Packet 2可变第2个媒体数据包Packet 3可变第3个媒体数据包Packet...可变第...个媒体数据包Padding可变剩余字节以0填充
依据上面所述的媒体文件格式结构,媒体服务器在进行流式媒体服务时,首先需要使用媒体制作系统把媒体数据转换成本发明的文件格式,然后通过存储系统存储到磁盘,当用户点播媒体数据时,媒体服务器从磁盘系统读取预封装好的一定时间段内的媒体数据,根据媒体数据预封装的指令,把预封装好的媒体数据通过流传输协议发送出去。
首先媒体制作系统打开原始媒体文件取出媒体数据,如MP4或ASF媒体文件,然后根据本发明提供的上述HMF数据结构封装媒体数据,即,提取出媒体数据的信息,按照本发明提供的媒体文件头(HMF Header)生成HMF头文件(*.hmh)。然后按照本发明提供的媒体文件体(HMFBody)对媒体数据进行预封装,在预封装媒体数据时,还要参考不同的流传输协议,如使用实时传输协议(RTP),则按照RTP协议进行封装,根据预封装的媒体数据生成HMF文件体中的Mage Body和Mage Header。同时,在具体封装操作时,一个码速率的媒体数据,经过预封装放在一个连续的文件位置,不同的码速率不交织,最后形成HMF体文件(*.hmd)。
然后,媒体存储系统把上述HMF文件的两个文件(*.hmh,*.hmd)存储到磁盘系统,假设磁盘系统使用RAID(廉价冗余磁盘阵列)系统,最好将*.hmh文件存储在单独的一个磁盘上,该磁盘可以使用普通的文件系统,而*.hmd文件通过RAID系统存储到磁盘阵列上,参考图9。
媒体服务器在接收到用户的点播请求时,首先根据用户请求确定媒体文件名,然后访问系统磁盘打开相应的*.hmh文件,并解析*.hmh文件,然后根据流索引表对象(STTB)和用户点播请求的流标识(ID)获取流对应的流描述对象(HMSD),流媒体服务器读取HMSD信息,获取流描述信息,流描述信息包括该流对应的媒体数据在文件的偏移量和流关键帧的索引。
流媒体服务器在接收到用户播放器的播放请求时,根据用户播放的开始时间和流关键帧的索引,获取播放起始帧的媒体块(Mage)在*.hmd文件中的偏移量,然后媒体服务器根据起始帧的偏移量读取*.hmd文件中对应偏移量的媒体数据,即媒体块(Mage),根据需要一次读取多个Mage。根据读取的Mage的Mage Header,获取Mage Header的指令表,由于Mage Header中的指令表包括媒体数据包(Packet)在Mage中的位置,即偏移量(offset),以及该媒体数据包的处理指令(instruction),最后,媒体服务器根据上述指令发送预封装的数据包。当媒体服务器发送完N个Mage后,再顺序读取后面的N个Mage,做同样的处理。直到收到用户的停止播放请求或者文件播放结束。
总之,本发明在媒体服务器向用户发送媒体数据时,只需根据MageHeader的指令发送封装好的媒体数据,因此可以提高媒体服务器的媒体数据处理性能。同时,由于本发明把不同码流的媒体数据预封装成Mage,并放在*.hmd文件的不同位置,媒体服务器在每次发送一个媒体流,只需读取对应流的Mage,而不要读取所有的流数据,故可以支持系统一次读取多个媒体数据块,并且不会读取冗余的数据。另外本发明不同的码流的数据不交织在一起,因此能够提高磁盘吞吐量。