2007年12月2日星期日

rm文件格式

rm文件格式

RealMedia File Format (RMFF)
RealSystem Architecture introduces RealMedia File Format (RMFF), which lets RealSystem deliver high-quality multimedia
content over a variety of network bandwidths. Third-party developers can convert their media formats into RMFF, enabling
RealServer to deliver the files to RealPlayer or other applications built with the RealSystem SDK. Third-party developers
can thereby use RealSystem to transport content over the Internet to their own applications.

RealMedia File Format is a standard tagged file format that uses Four-Character codes to identify file elements. These codes
are 32-bit, represented by a sequence of one to four ASCII alphanumeric characters, padded on the right with space
characters. The data type for four-character codes is FOURCC. Use the PN_FOURCC macro to convert four characters into
a four-character code.

The basic building block of a RealMedia File is a chunk, which is a logical unit of data, such as a stream header or a packet of
data. Each chunk contains the following fields:

four-character code specifying the chunk identifier 32-bit value specifying the size of the data member in the chunk
blob of opaque chunk data Depending on its type, a top-level chunk can contain subobjects. This document describes the
tagged chunks contained in RMFF, as well as the format of the data stored in each type of tagged chunk.

Tagged File Formats:

Header Section Because RMFF is a tagged file format, the order of the chunks is not explicit, except that the RealMedia File
Header must be the first chunk in the file. However, most applications write the standard headers into the file's header
section. The following chunks are typically found in the header section of RMFF:
1.RealMedia File Header (This must be the first chunk of the file)
2.Properties Header
3.Media Properties Header
4.Content Description Header After the RealMedia File Header object, the other headers may appear in any order. All headers
are required except the Index Header. The following sections describe the individual header objects .
RealMedia File Header Each RealMedia file begins with the RealMedia File Header, which identifies the file as RMFF. There
is only one RealMedia File Header in a RealMedia file. Because the contents of the RealMedia File Header may change with
different versions of RMFF, the header structure supports an object version field for determining what additional fields
exists. The following pseudo-structure describes the RealMedia File Header:

RealMedia_File_Header
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{ UINT32 file_version;
UINT32 num_headers;
}
}

The RealMedia File Header contains the following fields:

1. object_id: 32 bits The unique object ID for a RealMedia File (.RMF). All RealMedia files begin with this identifier.
2. size: 32 bits The size of the RealMedia header section in bytes.
3. object_version: 16 bits The version of the RealMedia File Header object. All files created according to this specification
have an object_version number of 0 (zero).
4. file_version: 32 bits The version of the RealMedia file in PN Version format. All files created according to this specification
have a major version number of 1. This member is present on all RealMedia_File_Header objects with an object_version
of 0 (zero).
5. num_headers: 32 bits The number of headers in the header section that follow the RealMedia File Header. This member
is present on all RealMedia_File_Header objects with an object_version of 0 (zero).

Properties Header The Properties Header describes the general media properties of the RealMedia File. Components of the
RealMedia system use this object to configure themselves for handling the data in the RealMedia file or stream. There is only
one Properties Header in a RealMedia file. The following pseudo-structure describes the Properties header:

Properties
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{
UINT32 max_bit_rate;
UINT32 avg_bit_rate;
UINT32 max_packet_size;
UINT32 avg_packet_size;
UINT32 num_packets;
UINT32 duration;
UINT32 preroll;
UINT32 index_offset;
UINT32 data_offset;
UINT16 num_streams;
UINT16 flags;
}
}

The Properties Header contains the following fields:
1. object_id: 32 bits The unique object ID for a Properties Header ('PROP').
2. size: 32 bits The size of the Properties Header in bytes.
3. object_version: 16 bits The version of the RealMedia File Header object. All files created according to this specification
have an object_version number of 0 (zero).
4. max_bit_rate: 32 bits The maximum bit rate required to deliver this file over a network. This member is present on all
Properties objects with an object_version of 0 (zero).
5. avg_bit_rate: 32 bits The average bit rate required to deliver this file over a network. This member is present on all
Properties objects with an object_version of 0 (zero).
6. max_packet_size: 32 bits The largest packet size (in bytes) in the media data. This member is present on all Properties
objects with an object_version of 0 (zero).
7. avg_packet_size: 32 bits The average packet size (in bytes) in the media data. This member is present on all Properties
objects with an object_version of 0 (zero).
8. num_packets: 32 bits The number of packets in the media data. This member is present on all Properties objects with an
object_version of 0 (zero).
9. duration: 32 bits The duration of the file in milliseconds. This member is present on all Properties objects with an
object_version of 0 (zero).
10. preroll: 32 bits The number of milliseconds to pre-buffer before starting playback. This member is present on all
Properties objects with an object_version of 0 (zero).
11. index_offset: 32 bits The offset in bytes from the start of the file to the start of the index header object. This member is
present on all Properties objects with an object_version of 0 (zero).
12. data_offset: 32 bits The offset in bytes from the start of the file to the start of the Data Section. This member is present
on all Properties objects with an object_version of 0 (zero).
13. num_streams: 16 bits The number of media streams contained in the file. This member is present on all Properties
objects with an object_version of 0 (zero).
14. flags: 16 bits Flags indicating characteristics of the RealMedia file. The following flags are defined:

#define PN_SAVE_ENABLED 0x0001 Allows clients to save a copy of the RealMedia file to disk.
#define PN_PERFECT_PLAY_ENABLED 0x0002 Allows clients to use extra buffering to ensure Perfect Play.
#define PN_LIVE_BROADCAST 0x0004 The RealMedia file is being generated by a live broadcast.

Media Properties Header The Media Properties Header describes the specific media properties of each stream in a
RealMedia File. Components of the RealMedia system use this object to configure themselves for handling the media data
in each stream. There is one Media Properties Header for each media stream in a RealMedia file. The following
pseudo-structure describes the Media Properties header:

Media_Properties
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{
UINT16 stream_number;
UINT32 max_bit_rate;
UINT32 avg_bit_rate;
UINT32 max_packet_size;
UINT32 avg_packet_size;
UINT32 start_time;
UINT32 preroll;
UINT32 duration;
UINT8 stream_name_size;
UINT8[stream_name_size] stream_name;
UINT8 mime_type_size;
UINT8[mime_type_size] mime_type;
UINT32 type_specific_len;
UINT8[type_specific_len] type_specific_data;
}
}

The Media Properties Header contains the following fields:
1. object_id: 32 bits The unique object ID for a Media Properties Header ("MDPR").
2. size: 32 bits The size of the Media Properties Header in bytes.
3. object_version: 16 bits The version of the Media Properties Header object.
4. stream_number: 32 bits The stream_number (synchronization source identifier) is a unique value that identifies a media
stream. Every data packet that belongs to a media stream contains the same STREAM_NUMBER. The STREAM_NUMBER
enables a receiver of multiple media streams to distinguish which packets belong to each media stream. This member is
present on all MediaProperties objects with an object_version of 0 (zero).
5. max_bit_rate: 32 bits The maximum bit rate required to deliver this stream over a network. This member is present on all
MediaProperties objects with an object_version of 0 (zero).
6. avg_bit_rate: 32 bits The average bit rate required to deliver this stream over a network. This member is present on all
MediaProperties objects with an object_version of 0 (zero).
7. max_packet_size: 32 bits The largest packet size (in bytes) in the stream of media data. This member is present on all
MediaProperties objects with an object_version of 0 (zero).
8. avg_packet_size: 32 bits The average packet size (in bytes) in the stream of media data. This member is present on all
MediaProperties objects with an object_version of 0 (zero).
9. start_time: 32 bits The time offset in milliseconds to add to the timestamp of each packet in a media stream. This member
is present on all MediaProperties objects with an object_version of 0 (zero).
10. preroll: 32 bits The time offset in milliseconds to subtract to the timestamp of each packet in a media stream. This member
is present on all MediaProperties objects with an object_version of 0 (zero).
11. duration: 32 bits The duration of the stream in milliseconds. This member is present on all MediaProperties objects with
an object_version of 0 (zero).
12. stream_name_size: 8 bits The length of the following stream_name field in bytes. This member is present on all
MediaProperties objects with an object_version of 0 (zero).
13. stream_name: variable length A non-unique alias or name for the stream. This member is present on all MediaProperties
objects with an object_version of 0 (zero).
14. mime_type_size: 8 bits The length of the following mime_type field in bytes. This member is present on all MediaProperties
objects with an object_version of 0 (zero).
15. mime_type: variable length A non-unique MIME style type/subtype string for data associated with the stream. This member
is present on all MediaProperties objects with an object_version of 0 (zero).
16. type_specific_len: 32 bits The length of the following type_specific_data in bytes. The type_specific_data is typically used
by the datatype renderer to initialize itself in order to process the media stream. This member is present on all
MediaProperties objects with an object_version of 0 (zero).
17. type_specific_data: variable length The type_specific_data is typically used by the data-type renderer to initialize itself in
order to process the media stream. This member is present on all MediaProperties objects with an object_version of 0 (zero).

Content Description Header The Content Description Header contains the title, author, copyright, and comments information
for the RealMedia File. All text data is in ASCII format. The following pseudo-structure describes the Content Description
Header:

Content_Description
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{
UINT16 title_len;
UINT8[title_len] title;
UINT16 author_len;
UINT8[author_len] author;
UINT16 copyright_len;
UINT8[copyright_len] copyright;
UINT16 comment_len;
UINT8[comment_len] comment;
}
}

The Content Description Header contains the following fields:
1. object_id: 32 bits The unique object ID for the Content Description Header ('CONT').
2. size: 32 bits The size of the Content Description Header in bytes.
3. object_version: 16 bits The version of the Content Description Header object.
4. title_len: 16 bits The length of the title data in bytes. Note that the title data is not null terminated. This member is present
on all Content Description Header objects with an object_version of 0 (zero).
5. title: variable length An array of ASCII characters that represents the title information for the RealMedia file. This member
is present on all Content Description Header objects with an object_version of 0 (zero).
6. author_len: 16 bits The length of the author data in bytes. Note that the author data is not null terminated. This member is
present on all Content Description Header objects with an object_version of 0 (zero).
7. author: variable length An array of ASCII characters that represents the author information for the RealMedia file. This
member is present on all Content Description Header objects with an object_version of 0 (zero).
8. copyright_len: 16 bits The length of the copyright data in bytes. Note that the copyright data is not null terminated. This
member is present on all Content Description Header objects with an object_version of 0 (zero).
9. copyright: variable length An array of ASCII characters that represents the copyright information for the RealMedia file. this
member is present on all Content Description Header objects with an object_version of 0 (zero).
10. comment_len: 16 bits The length of the comment data in bytes. Note that the comment data is not null terminated. this
member is present on all Content Description Header objects with an object_version of 0 (zero).
11. comment: variable length An array of ASCII characters that represents the comment information for the RealMedia file.
This member is present on all Content Description Header objects with an object_version of 0 (zero).

Data Section The data section of the RealMedia file consists of a Data Section Header that describes the contents of the data
section, followed by a series of interleaved media data packets. Note that the size field of the Data Chunk Header is the size
of the entire data chunk, including the media data packets.

Data Chunk Header The Data Chunk Header marks the start of the data chunk. There is usually only one data chunk in a
RealMedia file, however for extremely large files there may be multiple data chunks. The following pseudo-structure
describes the Data chunk header:

Data_Chunk_Header
{
UINT32 object_id;
UINT32 size;
UINT16 object_version;
if (object_version == 0)
{
UINT32 num_packets;
UINT32 next_data_header;
}
}

The Data Chunk Header contains the following fields:
1. object_id: 32 bits The unique object ID for the Data Chunk Header ('DATA').
2. size: 32 bits The size of the Data Chunk in bytes.
3. object_version: 16 bits The version of the Data Chunk Header object.
4. num_packets: 32 bits Number of packets in the data chunk. This member is present on all Data Chunk Header objects with
an object_version of 0 (zero).
5. next_data_header: 32 bits Offset from start of file to the next data chunk. This field is not typically used. This member is
present on all Data Chunk Header objects with an object_version of 0 (zero).

Data Packet Header The data section of a RealMedia file consists of a series of interleaved data objects. Each data object
contains a packet of data for a media stream. Because a RealMedia file can contain numerous media streams, data objects
for each stream are interleaved. The following pseudo-structure describes the details of each interleaved packet:

Media_Packet_Header
{
UINT16 object_version;
if (object_version == 0)
{
UINT16 length;
UINT16 stream_number;
UINT32 timestamp;
UINT8 reserved;
UINT8 flags;
UINT8[length] data;
}
}

The Media Packet Header contains the following fields:
1. object_version: 16 bits The version of the Media Packet Header object.
2. length: 16 bits The length of the packet in bytes. This member is present on all Media Packet Header objects with an
object_version of 0 (zero).
3. stream_number: 16 bits The 16-bit alias used to associate data packets with their associated Media Properties Header.
this member is present on all Media Packet Header objects with an object_version of 0 (zero).
4. timeStamp: 32 bits The timestamp of the packet in milliseconds This member is present on all Media Packet Header objects
with an object_version of 0 (zero).
5. reserved: 8 bits This is not used. This member is present on all Media Packet Header objects with an object_version of 0 (zero).
6. flags: 16 bits Flags describing the properties of the packet. The following flags are defined:
#define PN_RELIABLE_FLAG 0x0001 If this flag is set, the packet is delivered reliably.
#define PN_KEYFRAME_FLAG 0x0002 If this flag is set, the packet is part of a key frame or in some way marks a boundary in
your data stream.this member is present on all Media Packet Header objects with an object_version of 0 (zero).
7. data: variable length The application-specific media data. This member is present on all Media Packet Header objects with
an object_version of 0 (zero).

Index Section The index section of the RealMedia file consists of a Index Chunk Header that describes the contents of the
index section, followed by a series of index records. Note that the size field of the Index Chunk Header is the size of the
entire index chunk, including the index records.

Index Section Header The Index Chunk Header marks the start of the index chunk. There is usually one index chunk per
stream in a RealMedia file. The following pseudo-structure describes the Index chunk header.

Index_Chunk_Header
{
u_int32 object_id;
u_int32 size;
u_int16 object_version;
if (object_version == 0)
{
u_int32 num_indices;
u_int16 stream_number;
u_int32 next_index_header;
}
}

The Index Chunk Header contains the following fields:
1. object_id: 32 bits The unique object ID for the Index Chunk Header ('INDX').
2. size: 32 bits The size of the Index Chunk in bytes.
3. object_version: 16 bits The version of the Index Chunk Header object.
4. num_indices: 32 bits Number of index records in the index chunk. This member is present on all Index Chunk Header
objects with an object_version of 0 (zero).
5. stream_number: 16 bits The stream number for which the index records in this index chunk are associated. This member
is present on all Index Chunk Header objects with an object_version of 0 (zero).
6. next_index_header: 32 bits Offset from start of file to the next index chunk. This field lets RealMedia file format readers
find all the index chunks quickly. This member is present on all Index Chunk Header objects with an object_version of 0 (zero).

Index Record The index section of a RealMedia file consists of a series of index record objects. Each index record contains
information for quickly finding a packet of a particular time stamp for a media stream. The following pseudo-structure describes
the details of each index record:

IndexRecord
{
UINT16 object_version;
if (object_version == 0)
{
u_int32 timestamp;
u_int32 offset;
u_int32 packet_count_for_this_packet;
}
}

An Index Record contains the following fields:
1. object_version: 16 bits The version of the Index Record object.
2. timestamp: 32 bits The timestamp in milliseconds associated with this record. This member is present on all Index Record
objects with an object_version of 0 (zero).
3. offset: 32 bits The offset from the start of the file at which this packet can be found. This member is present on all Index
Record objects with an object_version of 0 (zero).
4. packet_count_for_this_packet: 32 bits The packet number of the packet for this record. This is the same number of packets
that would have been seen had the file been played from the beginning to this point. This member is present on all Index
Record objects with an object_version of 0 (zero).