AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Delphi

Delphi写的RM文件分析器源代码

51自学网 2015-09-02 http://www.51zixue.net

 

从逻辑上讲,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或记事本打开查看。

 
 

上一篇:Delphi实现提取可执行文件内部所有图标  下一篇:从网页源文件中获取链接的两种方法