1.wma文件是由asf封装的位流数据。
2一个asf容器,包含了 一个asf标志头,文件头指示了包的大小cbPacketSize,位流头。通过位流头,再确定是否为音频流头。如果是音频流的头,则可以进行格式判断。
3,可以读取audio_id,获取格式信息。 包括 采样率,比特率,block对齐长度,
4,一个包里面可以包含一个或者多个负载。这些负载可以来自不同的流信息。
在asf的头里面记录了packet的数据长度,本包的帧个数,帧大小。
5,packet的数据内容为帧,而一个帧可以分成多个 block的位流。 同一个block的数据,可以跨包存储。packet前面会记录有多少bit是属于上一个packet的。
解包流程:
解包头,获取数据---> 解帧头-->解帧(解block)
1、因为拆包的时候,包很可能不是按block的整数倍拆分的,所以包含上一包的数据。在帧头里面会有信息指出本包完整帧的起始位置。每一个的bit也可以不是byte对齐的,如第7点
2.本包解码的时候 本包的位流不一定耗尽,如果是非跨包存储的格式[flag2],需要丢弃。
3.每包的第一个完整block会重新reset_block_size
4.关系:文件组织的基本结构是cbPacketSize,它里面包含 n个segment的数据,如果是audio_seg的话,它的有效数据长度为nBlockAlign。
5.wma的bitrate是纯数据的比特流,不包含asf的消耗,所以要估计实际文件的比特率的话,需要计算下冗余度。
6.帧头的格式是: u8【包含帧数】+u16【前面是first_frame_bit【代表起始位置】,后面【13-nbsize】bit是属于block的数据】