rm文件格式资料课件

上传人:新** 文档编号:568593387 上传时间:2024-07-25 格式:PPT 页数:22 大小:325.50KB
返回 下载 相关 举报
rm文件格式资料课件_第1页
第1页 / 共22页
rm文件格式资料课件_第2页
第2页 / 共22页
rm文件格式资料课件_第3页
第3页 / 共22页
rm文件格式资料课件_第4页
第4页 / 共22页
rm文件格式资料课件_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《rm文件格式资料课件》由会员分享,可在线阅读,更多相关《rm文件格式资料课件(22页珍藏版)》请在金锄头文库上搜索。

1、RM文件的封装和解复用报告概述Rm文件简介Rm文件格式介绍2664Hisense的code中对rm文件的demuxRm文件简介简介:简介:RM格式是RealNetworks公司开发的一种流媒体视频文件格式,它的特点是文件小,但画质仍能保持的相对良好,可以根据网络数据传输的不同速率制定不同的压缩比率,从而实现低速率的Internet上进行视频文件的实时传送和播放,即先从服务器上下载一部分视频文件形成视频流缓冲区后实时播放同时继续下载为接下来的播放做好准备。音视频编码:音视频编码:RealAudio、RealVideo(见备注)与与rmvb的主要区别:的主要区别:rm格式采用的是固定码率编码rmv

2、b采用可变码率(VariableBitrate)在画面变动大的地方用的比特位多一些,平静的画面用少的比特位。Rm文件格式介绍Realchunktypes:.RMF:RealMediafileheader(onlyoneperfile,mustbethefirstchunk)PROP:Fileproperties(onlyoneperfile)MDPR:Streamproperties(oneforeachstream)CONT:Contentdescription/metadata(typicallyoneperfile)DATA:FiledataINDX:Fileindex(typicall

3、yoneperstream)每个单元的共同头部开始部分:typedefstructrm_generic_hdrunsignedlongid;/*uniqueidentifierforthisheader*/unsignedlongsize;/*sizeofheaderinfile*/unsignedshortversion;/*structversion*/_attribute_(packed)rm_generic_hdr_t;1.RealMediafileheader(.RMF)dwordchunktype(.RMF)dwordchunksize(typically0x12)wordchun

4、kversion(always0,foreveryknownfile)dwordfileversiondwordnumberofheadersThismustbethefirstchunkinaRealMediafile.Onlyone.RMFcanbepresentinafile.Theonlyusefulinformationcarriedby.RMFisthenumberofheaders.Rm_plugin_identify()atInputRM.c查看文件的开始是否为.RMF2.FilepropertiesHeader(PROP)typedefstructProperties_Hea

5、derUINT32object_id;0-3/object_id,属性头唯一标识,属性头唯一标识(“PROP”)UINT32size;4-7/size,属性头大小属性头大小UINT16object_version;8-9/object_version,RM文件头版本,决定结文件头版本,决定结构中其他成员的取舍,此结构中此值为零构中其他成员的取舍,此结构中此值为零if(object_version=0)UINT32max_bit_rate;10-13/网络传输网络传输时要求的最大比特率时要求的最大比特率UINT32avg_bit_rate;14-17/网络传输网络传输时要求的平均比特率时要求的平

6、均比特率UINT32max_packet_size;18-21/最最大媒体数据包的大小(以字节计算)大媒体数据包的大小(以字节计算)UINT32avg_packet_size;22-25/平平均媒体数据包的大小(以字节计算)均媒体数据包的大小(以字节计算)UINT32num_packets;26-29/媒体数据包媒体数据包个数个数UINT32duration;30-33/媒体文件应该播放媒体文件应该播放的时间(以毫秒计算)的时间(以毫秒计算)UINT32preroll;34-37/回放之前的预留毫秒回放之前的预留毫秒数数UINT32index_offset;38-41/索引头到文件开始的偏移,

7、这个值可为索引头到文件开始的偏移,这个值可为零,零,表明没有索引段表明没有索引段UINT32data_offset;42-45/数据段到文件开始的偏移,用数据段到文件开始的偏移,用32个二进制个二进制位表示(注位表示(注:在在RM文件中可以有不止一个数据块头,这个值只表示第一个数据块文件中可以有不止一个数据块头,这个值只表示第一个数据块头到文件开始的偏移,其他数据块头的偏移可以从数据块头中头到文件开始的偏移,其他数据块头的偏移可以从数据块头中next_data_header域得到);域得到);UINT16num_streams;46-47/在主头段中在主头段中包含的全部媒体属性头包含的全部媒体

8、属性头(MDPR)的个数)的个数UINT16flags;48-49/包含文件信息的位掩码包含文件信息的位掩码;3.Mediapropertiesheader(MDPR)Media_PropertiesUINT32object_id;0-3/object_id:媒体属性头唯一标识,为媒体属性头唯一标识,为“MDPR”;4UINT32size;4-7/size,表明媒体属性头的大小;,表明媒体属性头的大小;4UINT16object_version;8-9/object_version,媒体属性头版本号;,媒体属性头版本号;2if(object_version=0)UINT16stream_num

9、ber;10-11/stream_number,流的标识,表明,流的标识,表明RM媒体文件中此媒体属性头代表的是哪个数据流(视频数据流或音频数据流),在数媒体文件中此媒体属性头代表的是哪个数据流(视频数据流或音频数据流),在数据段中的每个数据包中都包含有类似的标识以表明数据是属于哪个媒体流。当版本号据段中的每个数据包中都包含有类似的标识以表明数据是属于哪个媒体流。当版本号为零时此成员才存在;为零时此成员才存在;2UINT32max_bit_rate;12-15/max_bit_rate,网络上传输此媒体流所要,网络上传输此媒体流所要求的最大比特率,当版本号为零时此成员才存在;求的最大比特率,当

10、版本号为零时此成员才存在;4UINT32avg_bit_rate;16-19/avg_bit_rate,网络上传输此媒体流所要,网络上传输此媒体流所要求的平均比特率,当版本号为零时此成员才存在;求的平均比特率,当版本号为零时此成员才存在;4UINT32max_packet_size;20-23/max_packet_size,媒体流数据包的,媒体流数据包的最大容量(以字节计算),当版本号为零时此成员才存在;最大容量(以字节计算),当版本号为零时此成员才存在;4UINT32avg_packet_size;24-27/avg_packet_size,媒体流数据包的,媒体流数据包的平均容量(以字节计

11、算),当版本号为零时此成员才存在;平均容量(以字节计算),当版本号为零时此成员才存在;4UINT32start_time;28-31/start_time,开始时间(毫秒表示),用于加到数据包,开始时间(毫秒表示),用于加到数据包时间标志上,当版本号为零时此成员才存在;时间标志上,当版本号为零时此成员才存在;4UINT32preroll;32-35/preroll,和,和start_time相反的时间尺度(毫秒表示)相反的时间尺度(毫秒表示),用于从数据包时间标志中减去的值,当版本号为零时此成员才存在;,用于从数据包时间标志中减去的值,当版本号为零时此成员才存在;4UINT32duration

12、;36-39/duration,流的持续时间,当版本号为零时此成,流的持续时间,当版本号为零时此成员才存在;员才存在;4UINT8stream_name_size;40-40/stream_name_size,流名称所占字节,流名称所占字节数,当版本号为零时此成员才存在,用数,当版本号为零时此成员才存在,用8个二进制位表示;个二进制位表示;1UINT8stream_name;41-41/stream_name,流的名称,版本号为零时此,流的名称,版本号为零时此成员才存在,大小不定;成员才存在,大小不定;1UINT8mime_type_size;42-42/mime_type_size,表明下个

13、成员,表明下个成员(mime_type)所占的存储空间,版本号为零时此成员才存在,用)所占的存储空间,版本号为零时此成员才存在,用8个二进制位表示;个二进制位表示;1UINT8mime_type_sizemime_type;43-43/决定决定Type_Specific_Datamime_type,和流相关的,和流相关的MIME形式的类型或子类型字符串,形式的类型或子类型字符串,版本号为零时此成员才存在,大小不定;版本号为零时此成员才存在,大小不定;1UINT32type_specific_len;44-47/type_specific_len,表明下个成员,表明下个成员(pe_specifi

14、c_data)所占的存储空间,版本号为零时此成员才存在,;)所占的存储空间,版本号为零时此成员才存在,;4UINT8type_specific_lenType_Specific_Data;48-51/Type_Specific_Data,一般用来保存对流进行处理的特殊数据,版本号为零时此成员才,一般用来保存对流进行处理的特殊数据,版本号为零时此成员才存在,大小不定。存在,大小不定。4;mime_type(MultipurposeInternetMailExtensions)代表互联网媒体类型(Internetmediatype):#defineRM_PARSER_PREFIX_LOGICALl

15、ogical-#defineRM_PARSER_PREFIX_LOGICAL_FILEINFOlogical-fileinfo#defineRM_MIME_TYPE_MULTIRATE_REALAUDIOaudio/x-pn-multirate-realaudio#defineRM_MIME_TYPE_MULTIRATE_REALVIDEOvideo/x-pn-multirate-realvideo#defineRM_MIME_TYPE_REALAUDIOaudio/x-pn-realaudio#defineRM_MIME_TYPE_REALVIDEOvideo/x-pn-realvideo#

16、defineRM_MIME_TYPE_REALVIDEO_ENCRYPTEDvideo/x-pn-realvideo-encrypted#defineRM_MIME_TYPE_REALAUDIO_ENCRYPTEDaudio/x-pn-realaudio-encrypted#defineRM_MIME_TYPE_REALAUDIO_LOSSLESSaudio/x-ralf-mpeg4-generic#defineRM_MIME_TYPE_REALEVENTapplication/x-pn-realevent#defineRM_MIME_TYPE_REALEVENT_ENCRYPTEDappli

17、cation/x-pn-realevent-encrypted#defineRM_MIME_TYPE_REALIMAGEMAPapplication/x-pn-imagemap#defineRM_MIME_TYPE_REALIMAGEMAP_ENCRYPTED application/x-pn-imagemap-encrypted#defineRM_MIME_TYPE_IMAGEMAPimage_map/x-pn-realvideo#defineRM_MIME_TYPE_IMAGEMAP_ENCRYPTEDimage_map/x-pn-realvideo-encrypted#defineRM_

18、MIME_TYPE_SYNCMMsyncMM/x-pn-realvideo#defineRM_MIME_TYPE_SYNCMM_ENCRYPTEDsyncMM/x-pn-realvideo-encrypted4.Contentdescriptionheader(CONT)dwordChunktype(CONT)dwordChunksizewordChunkversion(always0,foreveryknownfile)wordTitlestringlengthbyteTitlestringwordAuthorstringlengthbyteAuthorstringwordCopyright

19、stringlengthbyteCopyrightstringwordCommentstringlengthbyteCommentstringThischunkcontainssometextinformation(liketitle,author,.)aboutthecontentofthefile.Thisheaderhasaninformativepurposeonlyanditsnotneededtodemuxthefile.DATA:Filedata标记数据块的开始位置。一般的RM文件通常只有一个数据块。很大的文件,可能由多个数据块。Data_Chunk_HeaderUINT32ob

20、ject_id;UINT32size;UINT16object_version;if(object_version=0)UINT32num_packets;UINT32next_data_header;object_id:数据块头的唯一ID(DATA)。size:数据块的大小。object_version:数据块头对象的版本.num_packets:数据块中包的数量。next_data_header:下一个数据块的开始位置。DataPacketHeaderMedia_Packet_HeaderUINT16object_version;if(object_version=0)|(object_v

21、ersion=1)UINT16length;UINT16stream_number;UINT32timestamp;if(object_version=0)UINT8packet_group;UINT8flags;elseif(object_version=1)UINT16asm_rule;UINT8asm_flags;UINT8lengthdata;object_version:媒体数据包头对象的版本号。length:数据包的字节数。stream_number:用于连接数据包和与之有关的媒体属性头。timeStamp:时间戳。packet_group:属于哪个组。flags:描述这个数据包的

22、属性。asm_rule:将ASMrule赋值给这个数据包。asm_flags:包含HX_flags.指定流交换指针。data:程序指定的媒体数据。elseStreamDone();INDX:Fileindex(typicallyoneperstream)AINDXchunkhasthefollowingformatdwordChunktype(INDX)dwordChunksizewordChunkversion(always0,foreveryknownfile)dwordNumberofentriesinthischunkwordStreamnumberdwordOffsetofthene

23、xtINDXchunk(formthestartofthefile)byteIndexentriesEachindexentryhasthisformatwordEntryversion(always0,foreveryknownfile)dwordTimestamp(inms)dwordPacketoffsetinfile(formthestartofthefile)dwordPacketnumber在RMVB格式的视频文件中,要实现文件播放时拖动滚动条,画面较流畅,可通过读取rmvb文件中的INDX字段来实现。Demux流程mainIMSAP:ProcessKeyAbstractAP:Pr

24、ocessKeyAbstractAP:SwitchAPToVideoPlaybackAP:ActivateVideoPlaybackAP:loadMediaAbstractAP:LoadMediaWithRetryVideoPlayback:LoadMediaCNavigationFilter:LoadMedia()CNavigationFilter:SelectInputPlugin(this=0x1631bf8,org_path=0x3ff2dbf8fileset:/tmp/ramfs/volumes/C:/sam_640_750Kbps.rm,majorType=MEDIATYPE_FI

25、LESET,subType=MEDIASUBTYPE_FILESET,pbContinue=0x3ff2f084,bForcedIdentification=false,pFailure=0x14edb70,getAuthInfo=0,bRetryIOPlugin=false)atNavPluginFactory.cpp:1252激活openInputPluginXXX,并设置好INPUTPLUGINm_inputPlugin;。openInputPluginRM(majorType=MEDIATYPE_FILESET,subType=MEDIASUBTYPE_FILESET,mutex=0x

26、16323c0,pInputPlugin=0x1632004)atInputRM.c:941给InputPlugin设置一些函数pInputPlugin-loadMedia=rm_plugin_load_media;pInputPlugin-registerIOPlugin=rm_plugin_register_io;pInputPlugin-read=rm_plugin_read_block;pInputPlugin-identify=rm_plugin_identify;rm_plugin_identify(pInstance=0x1614e08,path=0x3ff2dbf8filese

27、t:/tmp/ramfs/volumes/C:/sam_640_750Kbps.rm,streamBuffer=0x420a0000.RMF,streamBufferBytes=32768,streamBufferOffset=0)atInputRM.c:40/*Lookformagicnumber.RMFatthebeginning*/如果ok则:rm_plugin_register_io(pInstance=0x15de9a8,ioPlugin=0x160c148,b_opening=1001,b_direct_io=1001,fh=0x15d4c48)atInputRM.c:791rm_

28、plugin_load_media(pInstance=0x15de9a8,path=0x3fb4e3e8“fileset:/tmp/ramfs/volumes/C:/sam_640_750Kbps.rm”,pbContinue=0x3fb4f874“001”,pFailure=0x14edb70)atInputRM.c:114设置rm_input_plugin_t结构体rm_parser_read_all_headersdoif(numBytesRead=rm_parser_unpack_generic_hdr(pRM,&genHdr)fileHeader)elseif(genHdr.id=

29、RM_PROPERTIES_OBJECT)rm_parser_unpack_properties_hdr(pRM,&pRM-propertyHeader)elseif(genHdr.id=RM_MEDIA_PROPERTIES_OBJECT)rm_parser_unpack_media_hdrelseif(genHdr.id=RM_CONTENT_OBJECT)rm_parser_unpack_content_hdrelseif(genHdr.id=RM_DATA_OBJECT)rm_data_build_data_chunk_table/*numHeaderinfileheaderobjec

30、tisverylargeandunreasonable.InordertoskipthoseuninterestingheadersortohandlethecasethatnumHeaderiswrong,wecanstopparsingheaderaslongasweencounterDATAOBJECT.Butmakesuremediapropertyheadersarenotmissed.*/elsewhile();/*parseindexchunks*/returnrm_data_build_index_table(pRM,pbContinue);rm_parser_unpack_m

31、edia_hdrrm_parser_unpack_audio_opaque_data(pRM,typeSpecSize,&(pMediaHdr-audio);rm_parser_unpack_video_opaque_data(pRM,typeSpecSize,&(pMediaHdr-video)rm_parser_unpack_logical_opaque_data(pRM,&pMediaHdr-logical);把把pMediaHdr的成员变量设置好。利于求得各个数据的大小。的成员变量设置好。利于求得各个数据的大小。rm_data_decide_streaming_mode(pRM=0x1

32、614e08)atrm_data.c:120rm_data_unpack_index_chunk_hdr(pRM=0x1614e08,pDataInfo=0x1615458,pbContinue=0x3ff2f084001)atrm_data.c:206CNavigationFilter:StartStreaming()CNavigationFilter:ThreadProcEntry(pInstance=0x160c298)CNavigationFilter:ThreadProc(this=0x160c298)CNavigationFilter:Read(this=0x1615700)atC

33、NavigationFilter.cpp:562m_inputPlugin.read():pInputPlugin-read=rm_plugin_read_block;atopenInputPluginRM()rm_plugin_read_block(pInstance=0x15d6650,pBuffer=0x3b7ffbf8,prohibitedChannelMask=,channelFullnessInfo=)atrm_reader_read(pRM=0x15d6650,pBuffer=0x3b7ffbf8)atrm_reader.c:827dorm_depack_get_packet(rm_input_plugin_t*pRM,NAVBUF*pBuffer)while();参考文献http:/wiki.multimedia.cx/index.php?title=RealMedia#Index_header_.28INDX.29http:/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号