http://hi.baidu.com/gongjun0371/blog/item/e38d28d6852e21d1a144dfb4.html
1 RM RMVB整体结构
RM文件格式是标准的标记符文件格式,RM文件格式把标记符块组合成头块,数据快,索引块,这些标记符块的组合方法如下:
.RMF头块 | RealMedia File Header(RM 文件头) |
PROP属性头 | Properties(属性头) |
MDPR媒体属性头 (可含多个) | Media Properties(媒体属性头1) |
Media Properties(媒体属性头2) | |
------(其他媒体属性头3—n) | |
CONT内容描述头 | Content Properties(内容描述头) |
DATA数据段 (可含多个) | Data Chunk Header(数据块头) |
Data Packets(数据包) | |
------(其他数据包) | |
Data Chunk Header(数据块头) | |
Data Packets(数据包) | |
------(其他数据包) | |
---------(其他数据段) | |
INDX索引段 (可含多个) | Index Section(索引段) |
------(其他索引段) |
typedef struct RealMedia_File_Header
{
UINT32 object_id; // object_id,RM文件的唯一标识(“.RMF”),所有的RM文件都以这个标识开头,用32个二进制位表示;
UINT32 size; // size,RM头段的大小,用32个二进制位表示;//上述结构体中五个元素都含有时,为18字节
UINT16 object_version; // object_version,RM文件头的版本,决定结构中其他成员的取舍,用16个二进制位表示;
if((object_version==0)||(object_version= =1))
{
UINT32 file_version; // file_version,RM文件的版本,用32个二进制位表示;
UINT32 num_headers; // num_headers,头段中RM文件头后面的包含的头的个数,用32个二进制位表示。
}
};
注:num_headers具体指那些头的个数,不明,有文件该值为7,但仅包含1个PROP,3个MPPR,1个CONT,如果算上.RMF共6个;另外有文件该值为7,包含有1个PROP,3个MPPR,1个CONT,如果算上.RMF共6个,如果算上INDX(3个)则总数是9个。
如图1.png
object_id = 2E 52 4D 46 .RMF size = 00 00 00 12 18 object_version = 00 01 file_version = 00 00 00 00 num_headers = 00 00 00 07
3 PROP属性头
属性头描述了RM文件的一般媒体属性,RM系统的组件根据属性头进行适当的配置来 处理RM文件或RM流中数据。在RM文件中只有一个属性头,数据结构如下:
typedef struct Properties_Header
{
UINT32 object_id; [0-3] // object_id,属性头唯一标识 (“PROP”),用32个二进制位表示;
UINT32 size;[4-7] // size,属性头大小,用32个二进制位表示;10+40字节
UINT16 object_version;[8-9] // object_version,RM文件头版本,决定结构中其他成员的取舍,此结构中此值为零,用16个二进制位表 示;
if(object_version==0)
{
UINT32 max_bit_rate;[10 - 13] // 网络传输 时要求的最大比特率,用32个二进制位表示;
UINT32 avg_bit_rate;[14 - 17] // 网络传输 时要求的平均比特率,用32个二进制位表示;
UINT32 max_packet_size;[18 - 21] // 最 大媒体数据包的大小(以字节计算),用32个二进制位表示;
UINT32 avg_packet_size;[22 - 25] // 平 均媒体数据包的大小(以字节计算),用32个二进制位表示;
UINT32 num_packets;[26 - 29] // 媒体数据包 个数,用32个二 进制位表示;
UINT32 duration;[30 - 33] // 媒体文件应该播放 的时间(以毫秒计算),用32个二进制位表示;
UINT32 preroll; [34 - 37] // 回放之前的预留毫秒 数,用32个二进 制位表示;
UINT32 index_offset; [38 - 41] // 索引头到文件开始的偏移,这个值可为零,表明没有索引段,用32个二进制位表示;
UINT32 data_offset; [42 - 45] // 数据段到文件开始的偏移,用32个二进制位表示(注:在RM文件中可以有不止一个数据块头,这个值只表示第一个数据块头到文件开始的偏移,其他数据块头的偏移可以从数据块头中next_data_header域得到);
UINT16 num_streams; [46 - 47] // 在主头段中 包含的全部媒体属性头(MDPR)的个数,用16个二进制位表示;
UINT16 flags; [48 - 49] // 包含文件信息的位掩码, 用16个二进制位 表示。具体信息如表5.1,其它位应设置为零。
}
};
表1
文件信息的位掩码表
位 | 标志 | 描述 |
0 | 保存允许 | 如果是1,就允许保存此文件到磁盘 |
1 | 最佳播放 | 如果是1, 建议使用额外的缓存 |
2 | 实况 | 如果是1, 表明媒体流来自实况广播 |
|
|
|
Media_Properties
{
UINT32 object_id;[0 - 3] // object_id:媒体属性头唯一标识,为“MDPR”; 4
UINT32 size;[4 - 7] // size,表明媒体属性头的大小; 4
UINT16 object_version;[8 - 9] // object_version,媒体属性头版本号; 2
if(object_version==0)
{
UINT16 stream_number; [10 - 11] // stream_number,流的标识,表明RM媒体文件中此媒体属性头代表的是哪个数据流(视频数据流或音频数据流),在数据段中的每个数据包中都包含有类似的标识以表明数据是属于哪个媒体流。当版本号为零时此成员才存在; 2
UINT32 max_bit_rate; [12 - 15] // max_bit_rate,网络上传输此媒体流所要求的最大比特率,当版本号为零时此成员才存在; 4
UINT32 avg_bit_rate; [16 - 19] // avg_bit_rate,网络上传输此媒体流所要求的平均比特率,当版本号为零时此成员才存在; 4
UINT32 max_packet_size;[20 - 23] // max_packet_size,媒体流数据包的最大容量(以字节计算),当版本号为零时此成员才存在; 4
UINT32 avg_packet_size;[24 - 27] // avg_packet_size,媒体流数据包的平均容量(以字节计算),当版本号为零时此成员才存在; 4
UINT32 start_time;[28 - 31] // start_time,开始时间(毫秒表示),用于加到数据包时间标志上,当版本号为零时此成员才存在; 4
UINT32 preroll; [32 - 35] // preroll,和start_time相反的时间尺度(毫秒表示),用于从数据包时间标志中减去的值,当版本号为零时此成员才存在; 4
UINT32 duration; [36 -39] // duration,流的持续时间,当版本号为零时此成员才存在; 4
UINT8 stream_name_size;[40 - 40] // stream_name_size,流名称所占字节数,当版本号为零时此成员才存在,用8个二进制位表示; 1
UINT8 stream_name;[41 - 41] // stream_name,流的名称,版本号为零时此成员才存在,大小不定; 1
UINT8 mime_type_size;[42 - 42] // mime_type_size,表明下个成员(mime_type)所占的存储空间,版本号为零时此成员才存在,用8个二进制位表示; 1
UINT8[mime_type_size] mime_type;[43 - 43]
//决定Type_Specific_Data mime_type,和流相关的MIME形式的类型或子类型字符串,版本号为零时此成员才存在,大小不定; 1
UINT32 type_specific_len;[44 - 47] // type_specific_len,表明下个成员(pe_specific_data)所占的存储空间,版本号为零时此成员才存在,; 4
UINT8[type_specific_len] Type_Specific_Data;[48 - 51] // Type_Specific_Data,一般用来保存对流进行处理的特殊数据,版本号为零时此成员才存在,大小不定。 4
}
};
mime_type:1、audio/x-pn-realaudio
2、video/x-pn-realvideo
3、logical-fileinfo
图4
5 CONT 内容描述头
6 DATA数据段(包含多个)
7 INDEX索引