这部分的内容就是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 的结构。
Error Correction Data 和 Padding Data 都是可选项目,并不一定会有。
如果有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)
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 的时间戳信息。这里不再详细解释。大致格式如下。