| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11296 人关注过本帖
标题:[原创]RM文件分析器
只看楼主 加入收藏
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
得分:0 

基本的数据文件格式有两种,一种是文本格式,一种是二进制数据格式,RM文件是二进制数据格式。

随便找了一个RM文件,它的第一个INDX块在16进制编辑器中如下:

002a43f0h: F2 37 C5 11 F2 37 C5 11 F2 49 4E 44 58 00 00 02 ; ?????INDX...
002a4400h: 1A 00 00 00 00 00 25 00 00 00 2A 46 13 00 00 00 ; ......%...*F....
002a4410h: 00 00 00 00 00 03 76 00 00 00 00 00 00 00 00 07 ; ......v.........
002a4420h: 42 00 01 2E EB 00 00 00 83 00 00 00 00 0E 83 00 ; B...?..?....?
002a4430h: 02 50 97 00 00 00 FD 00 00 00 00 15 C5 00 03 79 ; .P?..?....?.y
002a4440h: CA 00 00 01 76 00 00 00 00 1D 07 00 04 5A 24 00 ; ?..v........Z$.
002a4450h: 00 01 E8 00 00 00 00 24 48 00 05 66 A2 00 00 02 ; ..?...$H..f?..
002a4460h: 61 00 00 00 00 2B 8A 00 06 8D 79 00 00 02 D9 00 ; a....+?.峺...?

从002a43f9开始的4个字节49 4E 44 58是object_id,固定为INDX;紧接的4个字节00 00 02 1A是size,转换为十进制为538表明这个INDX块的总长度为538字节;紧接的2个字节00 00是object_version,一般为0;紧接的4个字节00 00 00 25是num_indices,表明这个INDX块中有37条记录;紧接的2个字节00 00是stream_number,表明这个INDX块对标识为0的媒体流数据包进行索引;紧接的4个字节00 2A 46 13是next_index_header,表明下一个INDX块从文件的2770451字节处开始。

接下来就是索引记录,开始的2个字节00 00是object_version,一般为0;紧接的4个字节00 00 00 00是timestamp,表明该索引记录对应的数据包时间戳为0毫秒;紧接的4个字节00 00 03 76是offset,表明该索引记录对应的数据包在文件的886字节处;紧接的4个字节00 00 00 00是packet_count_for_this_packet,表明该索引记录对应的数据包是该媒体流中的第1个数据包(编号从0开始)。

接下来是第2条索引记录,开始的2个字节00 00是object_version,一般为0;紧接的4个字节00 00 07 42是timestamp,表明该索引记录对应的数据包时间戳为1858毫秒;紧接的4个字节00 01 2E EB是offset,表明该索引记录对应的数据包在文件的77547字节处;紧接的4个字节00 00 00 83是packet_count_for_this_packet,表明该索引记录对应的数据包是该媒体流中的第132个数据包。

以此类推,可以读出所有的索引记录。


我的百度空间→http://hi.baidu.com/yeye55
2007-04-15 20:11
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 

谢谢楼主!

2007-04-17 11:12
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 
我先去研究音频文件,等有问题再想楼主请教。
2007-04-17 15:55
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 
楼主你好!我想问下,你是根据什么来确定INDX在文件的位置?
2007-04-24 09:00
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
得分:0 
有两种方法:第一种,PROP块的index_offset成员指出第一个INDX块在文件中的位置,每个INDX块的next_index_header成员指出下一个INDX块的位置。第二种方法,在INDX块之前是:.RMF块、PROP块、多个MDPR块、CONT块、DATA块,这些块都有size成员指出块的大小,依次读取这些块,将它们的size成员加起来就是第一个INDX块在文件中的位置,这种方法适合那些PROP块的index_offset成员有错误的RM文件格式。

我的百度空间→http://hi.baidu.com/yeye55
2007-04-24 19:37
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 

谢谢!楼主我现在学习RTSP,我有好地方不太明白!我是想从RTSP服务器,下载一个RM文件,分析里面数据,我算出来NumInterleavePackets这个数字就是不对呢。楼主你这方面熟不?能给讲讲不?

2007-04-27 23:13
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
得分:0 
哦,RTSP协议我不熟。

我的百度空间→http://hi.baidu.com/yeye55
2007-04-28 13:39
ouwind
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-4-28
收藏
得分:0 
rtsp做下载的话,只要把数据这部分rtsp的头去掉就可以了
问一下lz:我现在有这样的需求,做拖动效果,不用realplayer的控件
服务器和客户端都是我自己来实现,客户端是调用realplayer来做播放器,协议是http
假设我想让他从中间开始播放,我试了一下把metadata+第n个包开始发给realplayer,结果能播,但是没声音
而且把这些数据保存为文件也只能播放
2007-04-28 19:21
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
得分:0 
涉及到协议和网络传输方面的,我不太熟悉。

我的百度空间→http://hi.baidu.com/yeye55
2007-04-29 20:13
kingstarer
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-4-12
收藏
得分:0 
LZ还在么?

我在写一个小程序改变rm文件的信息,也就是Content_Description块里面的内容,但发现修改了之后的文件不能播放

请问在修改时除了要修改Content_Description块的内容外还要修改哪些内容才行啊?
2007-05-03 19:13
快速回复:[原创]RM文件分析器
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022669 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved