RealNetworks公司的RealMedia包括RealAudio、RealVideo和RealFlash三类文件,其中RealAudio用来传输接近CD音质的音频数据,RealVideo用来传输不间断的视频数据,RealFlash则是RealNetworks公司与Macromedia公司新近联合推出的一种高压缩比的动画格。RealMedia文件格式的引入,使得RealSystem可以通过各种网络传送高质量的多媒体内容。第三方开发者可以通过RealNetworks公司提供的SDK将它们的媒体格式转换成RealMedia文件格式。
RealMedia文件格式是标准的标识文件格式,它使用四字符编码来标识文件元素。组成RealMedia文件的基本部件是块(chunk),它是数据的逻辑单位,如流的报头,或一个数据包。每个块包括下面的字段:
指明块标识符的四字符编码
块中限定数据大小的32位数值。
数据块部分
依类型的不同,上层的块可以包含子对象。
图10- RealMedia文件块示意图
RM文件主要有三部分:报头部分,数据部分,索引部分。
1. 报头部分
因为RM文件格式是一种加标识的文件格式,块的顺序没有明确规定,但RM文件报头必须是文件的第一个块。
一般情况下,RM 的报头部分有下面四种:
(1) RM文件报头 (RM文件的第一个块),文件中其标识是“. RMF”。
(2) 属性报头(Properties Header ),文件中其标识是“PROP”,主要是描述文件的综合信息。
(3) 媒体属性报头(Media Properties Header ),文件中用“MDPR”标识,主要是描述流的类型和相应编码类别。
(4) 内容描述报头(Content Description Header ),文件中用“CONT”标识,主要是描述文件的作者等信息。
RealMedia 文件报头以后,其它报头的出现可以任何次序。
2. 数据部分
RM文件的数据部分由数据部分报头和后面排列的媒体数据包组成。数据块报头标志数据块的开始,说明后续有多少个包。媒体数据包是流媒体数据的数据包。RM的数据部分在文件中用“DATA”标识,数据部分可以将各个流的数据放入一个DATA内,也可以将各个流的数据分别放入各自的DATA区域内。
3. 索引部分
RM文件的索引部分由描述索引区内容的索引块报头和一串索引记录组成。在文件中该部分用“INDX”标识,各个流一般有其对应的INDX部分。标志了该流的关键帧位置。
RM文件格式各个部分的详细结构如下:
. RMF:文件头
Type UINT32
Size UINT32
Version UINT16 /*文件版本不同,文件格式就有些区别,以下结构为版本01*/
Resv UINT32
Chunknum UINT32
PROP:文件属性描述
Type UINT32
Size UINT32
Version UINT16
Maxbitrate UINT32
Argbitrate UINT32
Packetnum UINT32
Duration UINT32
Preroll UINT32
Index offset UINT32
Data offset UINT32
Streamnum UINT16
Flag UINT16
CONT:内容描述
Type UINT32
Size UINT32
Version UINT16
Len1 UINT16
Name[len1] UINT8
Len2 UINT16
Author[len2] UINT8
Len3 UINT16
Copyright[len3] UINT8
Len4 UINT16
Comment[len4] UINT8
Len5 UINT16 /*Resv项是可有可无的*/
Resv[len5] UINT8
MDPR:媒体属性描述
Type UINT32
Size UINT32
Version UINT16
StreamId UINT16
Maxbitrate UINT32
Argbitrate UINT32
Maxpacketsize UINT32
Argpacketsize UINT32
Starttime UINT32
Preroll UINT32
Duration UINT32
Desprition len UINT8
Desprition[len] UINT8
Mimetype len UINT8
Mimetype[len] UINT8
Codec data size UINT32 /*如果不为0,则后面有Codec*/
CodecAtom /*目前已知两种,也只有这两种在rm文件中有作用*/
/*******************************************************************/
. ra : 音频流
Size UINT32
Codec type UINT32
Version UINT16 /*版本不同,后面也会不同,下述为5*/
Resv UINT16
Type UINT32
Resv UINT32
Version UINT16
Codec flavor id UINT16
Coded_frame_size UINT32
Resv UINT32
Resv UINT32
Resv UINT32
Sub_packet_h UINT32
Frame_size UINT16
Sub_packet_size UINT16
Resv UINT16
Maxsamplerate UINT32
Argsamplerate UINT32
Samplesize UINT32
Channels UINT16
Genr UINT32
Fourcc UINT32 /*根据此数据的不同,后面也不同,下述为常见的cook类型*/
Resv UINT32
Codecdata_length UINT32
Codecdata[Codecdata_length] UINT8
VIDO:视频流
Size UINT32
Type UINT32 /*VIDO*/
Format UINT32 /*RV40*/
Width UINT16
Height UINT16
Fps UINT16
Resv UINT32
Fps UINT16 /*if this fps>0,change fps to this value*/
Resv UINT16
Subformat UINT32
Subformatid UINT32
INDX:索引部分
Type UINT32
Size UINT32
Version UINT16
Entrysnum UINT32
Streamid UINT32
Nextindexpos UINT32
For( i = 0; i <entrysnum; i++)
{
Versrion UINT16
Timestamp UINT32
Offset UINT32
PacketNo UINT32
}
DATA: 数据部分
Type UINT32
Size UINT32
Version UINT16
Packetnum UINT32
Resv UINT32
For( i = 0; i <packetnum; i++)
{
Flag UINT16
Size UINT16
Streamid UINT16
Timestamp UINT32
Keyflag UINT16
Media Data;
}
注:文件版本 00 的主要区别是数据包部分的keyflag 为UINT24。