Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17074
  • 博文数量: 18
  • 博客积分: 390
  • 博客等级: 一等列兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-16 00:04
文章分类

全部博文(18)

文章存档

2012年(5)

2011年(13)

我的朋友
最近访客

分类: LINUX

2012-05-10 17:04:41

参考《ASF_Specification.doc》,基本就可以分析出wmv的大致结构和组成,当然,也还有部分属性、结构是与ASF specification对应不起来的,所以,第一次分析的话,最好下载微软提供的ASF View工具,这个工具可以按照ASF规范解析兼容的媒体文件的,而且,结构很清晰,很容易看懂,如下图所示:
wmv中如何找关键帧
 
根据ASF规范,数据对象的ObjectID是75B22636-668E-11CF-A6D9-00AA0062CE6C,所以,可以根据该GUID,找到数据对象的起始位置,然后参考ASF规范中ASF Data Object数据结构,对照媒体文件本身,应该就可以找出数据包以及每个包中的各个payload,而每个payload结构中,有个标志位表明该payload是否是关键帧。
需要特别注意的是,GUID的结构与文件的实际存储顺序是有差别的,如ASF Data Object的GUID是75B22636-668E-11CF-A6D9-00AA0062CE6C,而在媒体文件中,其顺序是这样的:36 26 B2 75 8E 66 CF 11-A6 D9 00 AA 00 62 CE 6C,就是前三个分段,每个分段都倒叙,而后面的俩个分段,则顺序,即第一个段位倒叙:->3626B275,第二个分段倒叙:668E->8E66,第三个分段倒叙:11CF->CF11,这样,整个GUID在文件中的顺序串就应该是这样的:3626B2758E66CF11A6D900AA0062CE6C
 
其实,即使参考ASF规范,有时候还是很难读懂wmv文件中的结构的,因为,ASF规范中给出的ASF Data Obeject结构是个可变的,有可能是下面这样的结构:
wmv中如何找关键帧
 
也有可能是下面的这样的结构:
wmv中如何找关键帧
因此,这就给解析ASF Data Object的结构带来的很大的麻烦和困扰。
 
由于Error Correction Data段是可选段,因此,要首选确定是否存在Error Correction Data段,确定的依据,就是ASF Data Object的GUID后的第273bit是否是1,如果是,那就存在Error Correction Data段,否则,就不存在Error Correction Data段。如果存在Error Correction Data段,其后面基本就会跟Payload Parsing Information段。而Payload Parsing Information段的正确解析最关键,因为Payload Parsing Information段中给出了后续字节的大小、长度等。
Payload Parsing Information段中的Multiple Payloads Present位则决定了真正Payload的类型和结构。
Payload有四种类型:
Single Payload、Single Payload with Compressed payload data、Multiple Payload、Multiple Payload with Compressed payload data。
因此,从Payload Parsing Information结构中解析出是否是Multiple Payload,然后再根据对应的Payload结构中的Replicted Data Length字段判断出是否是with compressed payload data的结构。
 
其实,如果只是想找出每个payload是否是关键帧的话,只要区分出是否是Multipel Payload类型即可,然后找出对应Payload类型的Stream number字段,Stream number字段的第一个bit就是标明该payload是否是关键帧的标志
 
 
很多情况下,我们一般都能看到这样的数据包内容:
82 00 00 09 5D 01 BA 02-00 00 7A 00
或者
82 00 00 08 5D 03 34 03-00 00 6B 00
其实红色部分就是Error Correction Data,蓝色部分就是Payload Parsing Information。
蓝色部分中,09表示该包中有多个payload,即是Multiple Payload类型。而5D后面的01和03则是padding data的长度。
阅读(1682) | 评论(0) | 转发(0) |
0

上一篇:asf介绍

下一篇:asf

给主人留下些什么吧!~~