| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11296 人关注过本帖
标题:[原创]RM文件分析器
只看楼主 加入收藏
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
 问题点数:0 回复次数:46 
[原创]RM文件分析器
最近在研究RM格式文件,我想自己设计一个RM文件编辑器,先设计了这个分析器,界面做的很简单,不过已经具有简单的编辑功能:

以下是可执行文件

L1JHlngv.zip (418.59 KB) [原创]RM文件分析器



PS:设计中发现的一个问题:如何判断最尾部数据包的时间长度?对于音频数据包的时间长度都是116毫秒,也就是说每个音频数据包保存了116毫秒的音频数据,但是对于视频数据包呢?特别是VBR压缩格式的视频数据包,由于我无法判断最尾部数据包的时间长度,所以用这个程序连接RM文件时生成的文件在播放时会出现错误。如果有那位高手知道的一定告诉我,谢谢啦。

[此贴子已经被作者于2007-4-12 22:12:47编辑过]



6X8rkeLz.zip (304.22 KB) [原创]RM文件分析器

搜索更多相关主题的帖子: 分析器 文件 
2007-03-11 21:29
Liming_686
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2006-4-9
收藏
得分:0 
先支持一下看,我喜欢这些.
2007-03-12 18:24
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 

好东西哦

2007-04-11 18:13
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 
楼主,你在不?我今天用了你写的RM分析器,很好用的,但是有几个地方不明白,想请教以下你呢!能加我QQ9033466,如果不方便邮箱也可以(sujiewen@gmail.con)!谢谢
2007-04-11 22:03
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 

楼主,我刚接触RM,我对它结构不是很熟悉,所以有写问题想跟你请教!这个问题是这样的,我对.RMF,PROP,MDPR,CONT,DATA,INDX这几部分,的全6个,还是有点了解,对INDX就不知道?还有,我想问下,你是怎么去分析里面实际数据的(就是数据包)以及INDX和文件关系?麻烦解决下我的迷惑!谢谢

2007-04-11 22:16
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
得分:0 

从逻辑上讲,RM文件由不同的流组成,每个流由一个MDPR头、零个或多数据包、一个INDX索引块组成,每个流都有一个唯一的媒体流标识。RM文件的实际存储结构由各种格式的块组成,每个块又可以包含子块,每个块都有一个size成员以确定块的长度,各个块在文件中的基本顺序如下:

.RMF块
PROP块,其中num_streams成员决定了会有几个MDPR块和INDX块
MDPR块,这个块会有多个
CONT块
DATA块,这个块中包含了多个数据包子块,不同流的数据包以时间为顺序交差存放
INDX块,这个块也会有多个,每个块中包含索引记录子块

PROP块的data_offset成员指出了DATA块在文件中的位置,DATA块中的5个成员之后就是第1个数据包,DATA块中前5个成员占18字节,也就是说PROP块的data_offset成员加上18就是第1个数据包在文件中的位置。数据包长度都不一样,由数据包length成员可以确定数据包的长度,读取第1个数据包确定其长度,计算出下一个数据包在文件中的位置,读取下一个数据包,以此类推可以实现数据包的历遍。

MDPR块、数据包子块、INDX块,都有一个stream_number成员来确定媒体流标识,INDX块中包含了多条记录,每条记录包含该媒体流的数据包在文件中的位置,但并不是所有的数据包都有对应的索引记录,相隔一定的时间差才对应一条索引记录,我设计的这个程序是相隔一定的时间(音频流1857毫秒,视频流83毫秒)后的关键帧数据包才建立一条索引记录(数据包的flags成员为2时表明这个数据包为关键帧数据包)。试用不同的编辑器后发现:时间差多少、是否是关键帧并不重要,只要相隔一定的时间建立一条索引记录,播放器都可以正常播放。

利用我这个程序打开一个RM格式文件,左边的树形窗口就可以看到各个块在RM文件中的情况,使用菜单“工具/读取数据包”可以历遍查看文件中的所有数据包,使用菜单“工具/索引时间差”可以查看建立索引记录时的最小时间差,使用菜单“工具/导出索引记录”可以将索引记录导出成用空格分隔的文本数据文件,这种文件可以用Excel或记事本打开查看。


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

太感谢,楼主!谢谢!

2007-04-12 22:27
tdjdyq
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-11
收藏
得分:0 

楼主,为什么INDX下面内容应该是一些数字,怎么是一些乱码呢?难道是编码后的吗?那它有是怎么编码的?能跟我说说吗?谢谢!

2007-04-13 09:24
yeye55
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:152
注 册:2007-1-19
收藏
得分:0 

不太明白你的意思。

说一下RM文件的基本数据格式,RM文件的基本数据由:无符号32位整型(UINT32)、无符号16位整型(UINT16)、无符号8位整型(UINT8)、ASCII字符串组成。需要注意的是整型数据写入文件的方向与Delphi的数据写入方向不一致,这种情况在很多文件格式中都会遇到,比如说十进制整型值2904000,在RM文件中为002C4FC0,如果用Delphi的读写函数将整型值2904000写入文件,就会变为C04F2C00,所以从RM文件中读取或写入整型数据时需要将数据调一个头,具体的代码可以参考RealMediaFile.pas文件中593行开始的代码,这些代码负责从TStream流中读取写入数据,其它方法都是调用这几个函数来完成对RM文件中基本数据的读取。


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

我不明白这里 INDX块,这个块也会有多个,每个块中包含索引--记录子块--按道理说,INDX后面的数据是由ObjectVersion Timestamp Offset NumInterleavePackets这四部分组成,这四部分是应该都是整数,但是是有我用十六进制打开RM文件看,发现INDX后面的数据好象是编码后的数据?

2007-04-15 09:23
快速回复:[原创]RM文件分析器
数据加载中...
 
   



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

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