前面一章中介绍了RM文件的头。由于是初步理解所以文章比较凌乱。
这一章节介绍RM文件的数据单元。
RM文件的数据单元包括一个数据单元头。数据单元头描述数据单元的内容。
接着就是一系列交叉存取的媒体信息包。
Data Chunk Header
标记数据块的开始位置。一般的RM文件通常只有一个数据块。很大的文件,可能由多个数据块。
Data_Chunk_Header
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{
UINT32 num_packets;
UINT32 next_data_header;
}
}
object_id: 数据块头的唯一ID(DATA)。
size: 数据块的大小。
object_version:数据块头对象的版本.
num_packets: 数据块中包的数量。
next_data_header:下一个数据块的开始位置。
Data Packet Header
Media_Packet_Header
{
UINT16 object_version;
if ((object_version == 0) || (object_version == 1))
{
UINT16 length;
UINT16 stream_number;
UINT32 timestamp;
if (object_version == 0)
{
UINT8 packet_group;
UINT8 flags;
}
else if (object_version == 1)
{
UINT16 asm_rule;
UINT8 asm_flags;
}
UINT8[length] data;
}
else
{
StreamDone();
}
这一章节介绍RM文件的数据单元。
RM文件的数据单元包括一个数据单元头。数据单元头描述数据单元的内容。
接着就是一系列交叉存取的媒体信息包。
Data Chunk Header
标记数据块的开始位置。一般的RM文件通常只有一个数据块。很大的文件,可能由多个数据块。
Data_Chunk_Header
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{
UINT32 num_packets;
UINT32 next_data_header;
}
}
object_id: 数据块头的唯一ID(DATA)。
size: 数据块的大小。
object_version:数据块头对象的版本.
num_packets: 数据块中包的数量。
next_data_header:下一个数据块的开始位置。
Data Packet Header
Media_Packet_Header
{
UINT16 object_version;
if ((object_version == 0) || (object_version == 1))
{
UINT16 length;
UINT16 stream_number;
UINT32 timestamp;
if (object_version == 0)
{
UINT8 packet_group;
UINT8 flags;
}
else if (object_version == 1)
{
UINT16 asm_rule;
UINT8 asm_flags;
}
UINT8[length] data;
}
else
{
StreamDone();
}
}
object_version : 媒体数据包头对象的版本号。
length: 数据包的字节数。
stream_number: 用于连接数据包和与之有关的媒体属性头。
timeStamp: 时间戳。
packet_group: 属于哪个组。
flags: 描述这个数据包的属性。
asm_rule: 将ASM rule赋值给这个数据包。
asm_flags: 包含HX_flags.指定流交换指针。
data: 程序指定的媒体数据。