RM 文件格式简析

RealNetworks公司的RealMedia包括RealAudioRealVideoRealFlash三类文件,其中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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值