Chinaunix首页 | 论坛 | 博客
  • 博客访问: 668394
  • 博文数量: 160
  • 博客积分: 2384
  • 博客等级: 大尉
  • 技术积分: 1366
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 11:35
文章分类
文章存档

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: 其他平台

2015-05-29 11:21:37

4.the Data Object

这部分的内容就是asf文件中数据。Data Object 中包含着很多个 Data Packets.这些Data Packets里面就是音视频数据。


先来看看 Data Object 结构

ASF_Data_ObjectGUID表示着这是Data Object 。
Total Data Packets  表示着里面包含的Data Packets 的数量。

还是上面的那个文件作为例子,通过解析Data Object  获得信息。

Data Object  (13636843 bytes)
Property Value  
File Position 829  ( 0x33D )  
Object ID 75B22636-668E-11CF-A6D9-00AA0062CE6C  
Object Size 13636843  ( 0xD014EB )  
 
MMS ID 247D3E82-C389-11D3-BD6F-00C0261004E0  
Packets 2081  
Alignment 1  
Packet Aligment 1


这个文件 Data Object  包含着2081个 Data Packets.让我看看 Data Packets 的结构。

4.1 Data Packets 


Error Correction Data 和 Padding Data 都是可选项目,并不一定会有。

Error correction data 




我们找到上面那个文件的第一个Data Packets。红色框里面的就是Error Correction Data 。第一个字节0x82后4位是2,表示Error Correction Data length 为2.Error Correction Data 内容就是接下来的2字节内容为:00 00.

Payload parsing information 

如果有Error Correction Data的话,Payload parsing information 是紧随其后的。

 

例子中蓝色框里就是 Payload parsing information 
前2字节Length Type Flags 和 Property Flags。表示接下相关内容长度的类型。

Length Type Flags  = 0x01,Property Flags = 0x5D;对位解析得:

Multiple Payloads Present= 1;表示这个Data Packet 不只是有1个流。

解析Length Type Flags 之后得知

Sequence Type = 0;Padding Length Type = 0;Packet Length Type=0;

也就是说之后的Packet Length、Sequence、Padding Length数据是不存在的。

然后紧着接就是4个字节的Send Time = 0x00000000、2个字节的Duration = 0x0064(100)

Payload data

之后就是 Payload data 了。如果上面的Multiple Payloads Present == 1.Payload data 的组成就按照下面的格式。(因为本文取得例子Multiple Payloads Present为1).所以就按照下面的格式来分析。

Payload Flags

绿色框里面0x84就是Payload Flags. 通过解析得知
Number of Payloads = 4;Payload Length Type= 10(WORD.)
Value type  Description
01               The Payload Length field is coded using a BYTE.
10               The Payload Length field is coded using a WORD.
11               The Payload Length field is coded using a DWORD.
也就是说这个 Data Packets 中含有 4个 Payload data.

Payloads 

结构如下图:

Stream Number 对应的值为0x01,他的结构如下:


解析可知 Stream Number = 1;Key Frame Bit = 0;

通过上文 【多媒体封装格式详解】---ASF(WMV/WMA)【1】 解析得知这个例子Stream Number 为1是wma音频格式数据。所以这个Payload 中包含的数据就是wma音频数据。

Key Frame 为0 表示 没有关键帧。

通过上面 Property Flags = 0x5D的对位解析可知。

Replicated Data Length Type = 0 1(BYTE.);

Offset Into Media Object Length Type = 1 1(DWORD.);

Media Object Number Length Type = 0 1(BYTE.);

紧着接知 

Media Object Number= 0x01;

Offset Into Media Object= 0x00000000;

Replicated Data Length= 0x8;

Replicated Data: CF 05 00 00 8D 0C 00 00

Payload Length 的类型是通过上面 Payload Flags得知为WORD.所以

Payload Length= 0x5CF(1487);

Payload Data : 接下来的1487个字节长度的内容就是Stream Number  1 ,wma音频数据了。

按照这个方法就可以把剩下的3个Payload依依解析出来。这样这个Data Packets 就解析完毕了。(剩下的3个Payload都是Stream Number 2 MP43格式视频数据)

这样我们就能完成基本的asf demux 的工作。把音视频流从asf封装格式里揪出来。

这个插1句,Replicated Data 中含有这个Payload 的时间戳信息。这里不再详细解释。大致格式如下。


5.Simple Index Object

这里要简单说一下 Simple Index Object,对视频来说关键帧的index对seek快进快退这种操作十分重要。能够快速定位到某给位置。常见的封装格式中几乎都有index的描述。除了ts这种传输流。
结构如下

Index Entries 中就指出了关键帧所在的Packet Number

通过Simple Index Object 给出的信息。你就可以自己建立一个关键帧的index表(找到给出所有关键帧Packet Number的位置,并记录下来).这样的话能够快速反应seek操作。
阅读(2727) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~