【多媒体封装格式详解】---ASF(WMV/WMA)
【1】
ASF全称Advanced Systems Format 高级串流格式,微软出的一种开放封装格式的标准。它可以包含很多内容如:音视频、脚本命令、JPEG、二进制文件、或是由开发者自己定义的内容.常见的遵循这种标准的封装格式.asf .wmv .wma.
1.最小组成单元ASF object
像FLV的tag、MKV的EBML一样,ASF文件也有类似的最小组成单元 ASF object.可以理解成ASF文件就是由很多个ASF object组成的。
Field | Size (bytes) |
Object GUID | 16 |
Object Size | 8 |
Object Data | varies (≥0) |
ASF object 是16个字节的GUID代表这个Object的类型,Object的类型有很多种。8个字节的 Size 代表这个Object的大小,紧接着就是Object的内容。
GUID: 即Globally Unique Identifier(全球唯一标识符). 是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-E)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指微软对UUID标准的实现。
GUID本质上是一个16字节(128位)的二进制数,最常见[1]的结构如下:
位 | 字节 | 描述 | 字节序 |
---|---|---|---|
32 | 4 | 数据1 | 原生 |
16 | 2 | 数据2 | 原生 |
16 | 2 | 数据3 | 原生 |
64 | 8 | 数据4 | 大端序 |
数据4的字节序和GUID显示成文本的结果相同,而其它3个数据在小端序的机器(如英特尔的CPU)上必须先转换成大端序。
举个例子打开一个文件
前16个字节就是GUID,转换成相应的格式就是 75B22630-668E-11CF-A6D9-00AA0062CE6C 查文档得知 这个GUID是ASF_Header_Object 标识着这个object是asf的头。
紧跟着8个字节size = 0x33D(829) 剩下的就是data
ASF_Header_Object 可以作为ASF容器格式的可辨识信息。ASF文件都是以ASF_Header_Object开头。
2.ASF 文件整体结构
3. Header Object
Header Object 包含着一系列的ASF object,它们分别代表着不同类型object,由GUID区分,以(ASF_Header_Object GUID) object开头。
它们提供了关于ASF DATA 的一些解释信息,如音视频类型及详细信息等, Header Object 可能包含如下类型的object:
File Properties Object. 包含整个文件属性,如文件大小、时长等.
Stream Properties Object. 包含数字多媒体特性,如音视频格式、PID等.
Header Extension Object. Allows additional functionality to be added to an ASF file while maintaining backward compatibility.
Content Description Object. Contains bibliographic information.
Script Command Object. Contains commands that can be executed on the playback timeline.
Marker Object. Provides named jump points within a file.
一般情况, Header Object必须包含1个 File Properties Object, 1个 Header Extension Object, 和至少一个Stream Properties Object.
还是以上面那个例子。上面的例子Header Object中包含了下面一些object
File Properties Object
File Properties Object (104 bytes) | ||
Property | Value | |
File Position | 30 ( 0x1E ) | |
Object ID | 8CABDCA1-A947-11CF-8EE4-00C00C205365 | |
Object Size | 104 ( 0x68 ) | |
Version | 2 | |
MMS ID | 247D3E82-C389-11D3-BD6F-00C0261004E0 | |
Total Size | 13639000 ( 0xD01D58 ) | |
Creation Time | 2000-1-5 15:00:32.820 | |
Packets | 2081 | |
Duration | 03:31.697 | |
Send Duration | 03:28.080 | |
Preroll | 00:03.199 | |
Flags | 0x00000002 | |
Broadcast | 0 | |
Seekable | 1 | |
Use Packet Template | 0 | |
Live | 0 | |
Reliable | 0 | |
Recordable | 0 | |
Unknown Data Size | 0 | |
Max Packet Size | 6553 ( 0x1999 ) | |
Min Packet Size | 6553 ( 0x1999 ) | |
Max Bitrate (bit/sec) | 524288 |
Stream Properties Object
- typedef struct {
- WORD wFormatTag;
- WORD nChannels;
- DWORD nSamplesPerSec;
- DWORD nAvgBytesPerSec;
- WORD nBlockAlign;
- WORD wBitsPerSample;
- WORD cbSize;
- } WAVEFORMATEX;
Stream Type | Audio Media | |
Format Tag | 353 | |
Channels | 2 | |
Samples / Seconds | 44100 | |
Average Bytes / Second | 8005 | |
Average Bitrate (bits/sec) | 64040 | |
Block Align | 1487 ( 0x5CF ) | |
Bits / Sample | 16 | |
Extra Data Size | 10 | |
Extra Data | 0000: 00 00 01 00 0F 00 78 2E-00 00 |
Format Tag 可看附表2 这个表示音频格式。通过查表得知353(0x161)对应的就是WMA2
这个 Stream Properties Object 就解析完毕了。
紧接着还是个 Stream Properties Object
绿色框 GUID BC19EFC0-5B4D-11CF-A8FD-00805F5C442B表示着是 ASF_Video_Media
蓝色框就是Type-Specific Data。
40 01 00 00 F0 00 00 00 02 28-00 28 00 00 00 40 01 00 00 F0 00 00 00 01 00 18-00
4D 50 34 33 00 84 03 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00
因为是ASF_Video_Media 就按照下表解析
Format Data 是 BITMAPINFOHEADER structure
Stream Type Specific | ||
Stream Type | Video Media | |
Window Width | 320 | |
Window Height | 240 | |
Flags | 2 | |
Bitmap Info Header | ||
biSize | 40 | |
Width | 320 | |
Height | 240 | |
Planes | 1 | |
Bits | 24 | |
Compression |
TEXT: MP43 0000: 4D 50 34 33 MP43 |
|
Image Size | 230400 ( 0x38400 ) | |
X Pels / Meter | 0 | |
Y Pels / Meter | 0 | |
Colors Used | 0 | |
Colors Important | 0 |
Compression ID 就是video 的格式,MP43。附表3
解析完了所有的 Stream Properties Object 就可以获得所有音视频基本信息。
Codec List Object
Object ID | 86D15240-311D-11D0-A3A4-00A0C90348F6 | ||||||||||||||||||||||
Object Size | 226 ( 0xE2 ) | ||||||||||||||||||||||
Codec ID | Reserved 2 | ||||||||||||||||||||||
Codecs | |||||||||||||||||||||||
|
附表1
附表2
Tag | Description | |
---|---|---|
0 | 0x0000 | Unknown |
1 | 0x0001 | Microsoft PCM |
2 | 0x0002 | Microsoft ADPCM |
3 | 0x0003 | IEEE Float |
4 | 0x0004 | Compaq VSELP |
5 | 0x0005 | IBM CVSD |
6 | 0x0006 | Microsoft ALAW |
7 | 0x0007 | Microsoft MULAW |
16 | 0x0010 | OKI ADPCM |
17 | 0x0011 | Intel DVI ADPCM |
18 | 0x0012 | Videologic MediaSpace ADPCM |
19 | 0x0013 | Sierra ADPCM |
20 | 0x0014 | Antex Electronics G.723 ADPCM |
21 | 0x0015 | DSP Solution DIGISTD |
22 | 0x0016 | DSP Solution DIGIFIX |
23 | 0x0017 | Dialogic OKI ADPCM |
24 | 0x0018 | MediaVision ADPCM |
25 | 0x0019 | HP CU |
32 | 0x0020 | Yamaha ADPCM |
33 | 0x0021 | Speech Compression Sonarc |
34 | 0x0022 | DSP Group True Speech |
35 | 0x0023 | Echo Speech EchoSC1 |
36 | 0x0024 | Audiofile AF36 |
37 | 0x0025 | APTX |
38 | 0x0026 | AudioFile AF10 |
39 | 0x0027 | Prosody 1612 |
40 | 0x0028 | LRC |
48 | 0x0030 | Dolby AC2 |
49 | 0x0031 | Microsoft GSM610 |
50 | 0x0032 | Microsoft MSNAudio |
51 | 0x0033 | Antex ADPCME |
52 | 0x0034 | Control Res VQLPC |
53 | 0x0035 | Digireal |
54 | 0x0036 | DigiADPCM AC2 |
55 | 0x0037 | Control Res CR10 |
56 | 0x0038 | NMS VBXADPCM AC2 |
57 | 0x0039 | Roland RDAC |
58 | 0x003A | EchoSC3 |
59 | 0x003B | Rockwell ADPCM |
60 | 0x003C | Rockwell Digit LK |
61 | 0x003D | Xebec |
64 | 0x0040 | Antex Electronics G.721 |
65 | 0x0041 | Antex Electronics G.728 CELP |
66 | 0x0042 | Microsoft MSG723 |
80 | 0x0050 | MPEG |
82 | 0x0052 | Voxware RT24 |
83 | 0x0053 | InSoft PAC |
85 | 0x0055 | MPEG Layer 3 |
89 | 0x0059 | Lucent G.723 |
96 | 0x0060 | Cirrus |
97 | 0x0061 | ESPCM |
98 | 0x0062 | Voxware |
99 | 0x0063 | Canopus Atrac |
100 | 0x0064 | APICOM G.726 ADPCM |
101 | 0x0065 | APICOM G.722 ADPCM |
102 | 0x0066 | Microsoft DSAT |
103 | 0x0067 | Microsoft DSAT Display |
105 | 0x0069 | Voxware Byte Aligned |
112 | 0x0070 | Voxware AC8 |
113 | 0x0071 | Voxware AC10 |
114 | 0x0072 | Voxware AC16 |
115 | 0x0073 | Voxware AC20 |
116 | 0x0074 | Voxware Metavoice |
117 | 0x0075 | Voxware Metasound |
118 | 0x0076 | Voxware RT29HW |
119 | 0x0077 | Voxware VR12 |
120 | 0x0078 | Voxware VR18 |
121 | 0x0079 | Voxware TQ40 |
128 | 0x0080 | Softsound |
129 | 0x0081 | Voxware TQ60 |
130 | 0x0082 | MSRT24 |
131 | 0x0083 | AT&T G.729A |
132 | 0x0084 | Motion Pixels MVI MV12 |
133 | 0x0085 | DF G.726 |
134 | 0x0086 | DF GSM610 |
136 | 0x0088 | ISIAudio |
137 | 0x0089 | Onlive |
145 | 0x0091 | Siemens SBC24 |
146 | 0x0092 | Dolby AC3 SPDIF |
151 | 0x0097 | ZyXEL ADPCM |
152 | 0x0098 | Philips LPCBB |
153 | 0x0099 | Packed |
256 | 0x0100 | Rhetorex ADPCM |
257 | 0x0101 | BeCubed IRAT |
273 | 0x0111 | Vivo G.723 |
274 | 0x0112 | Vivo Siren |
291 | 0x0123 | DEC G.723 |
512 | 0x0200 | Creative ADPCM |
514 | 0x0202 | Creative FastSpeech8 |
515 | 0x0203 | Creative FastSpeech10 |
544 | 0x0220 | Quarterdeck |
768 | 0x0300 | Fujitsu FM Towns Snd |
1024 | 0x0400 | BTV Digital |
1664 | 0x0680 | AT&T VME VMPCM |
4096 | 0x1000 | Olivetti OLIGSM |
4097 | 0x1001 | Olivetti OLIADPCM |
4098 | 0x1002 | Olivetti OLICELP |
4099 | 0x1003 | Olivetti OLISBC |
4100 | 0x1004 | Olivetti OLIOPR |
4352 | 0x1100 | LH Codec |
5120 | 0x1400 | Norris |
5121 | 0x1401 | AT&T ISIAudio |
5376 | 0x1500 | AT&T Soundspace Music Compression |
8192 | 0x2000 | DVM |
65534 | 0xFFFE | WAVE_FORMAT_EXTENSIBLE |
65535 | 0xFFFF | Experimental |
附表3
- const AVCodecTag ff_codec_bmp_tags[] = {
- { AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
- { AV_CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
- { AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
- { AV_CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
- { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
- { AV_CODEC_ID_H264, MKTAG('D', 'A', 'V', 'C') },
- { AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
- { AV_CODEC_ID_H264, MKTAG('Q', '2', '6', '4') }, /* QNAP surveillance system */
- { AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
- { AV_CODEC_ID_H263, MKTAG('X', '2', '6', '3') },
- { AV_CODEC_ID_H263, MKTAG('T', '2', '6', '3') },
- { AV_CODEC_ID_H263, MKTAG('L', '2', '6', '3') },
- { AV_CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') },
- { AV_CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') },
- { AV_CODEC_ID_H263, MKTAG('M', '2', '6', '3') },
- { AV_CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
- { AV_CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
- { AV_CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
- { AV_CODEC_ID_H263, MKTAG('U', '2', '6', '3') },
- { AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
- { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
- { AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
- { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
- { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) }, /* some broken avi use this */
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
- { AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
- { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
- { AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
- { AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
- { AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
- { AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
- { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
- { AV_CODEC_ID_MPEG4, MKTAG('W', 'A', 'W', 'V') }, /* WaWv MPEG-4 Video Codec */
- { AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') },
- { AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') },
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') },
- { AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') },
- { AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') },
- { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') },
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') },
- { AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') },
- { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') },
- { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') },
- { AV_CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') }, /* flipped video */
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') },
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') },
- { AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') },
- { AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') }, /* Ephv MPEG-4 */
- { AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') },
- { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') }, /* Divio MPEG-4 */
- { AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') },
- { AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') },
- { AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') },
- { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') },
- { AV_CODEC_ID_MPEG4, MKTAG('S', 'I', 'P', 'P') }, /* Samsung SHR-6040 */
- { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', '4', 'V') },
- { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'X') },
- { AV_CODEC_ID_MPEG4, MKTAG('D', 'r', 'e', 'X') },
- { AV_CODEC_ID_MPEG4, MKTAG('Q', 'M', 'P', '4') }, /* QNAP Systems */
- { AV_CODEC_ID_MPEG4, MKTAG('P', 'L', 'V', '1') }, /* Pelco DVR MPEG-4 */
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
- { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
- { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
- { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
- { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
- { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
- { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
- { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */
- { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */
- { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', '5') }, /* Canopus DV */
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'i', 's') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('p', 'd', 'v', 'c') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('S', 'L', '2', '5') },
- { AV_CODEC_ID_DVVIDEO, MKTAG('S', 'L', 'D', 'V') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) },
- { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', '7', '0', '1') }, /* Matrox MPEG2 intra-only */
- { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', 'v') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG('B', 'W', '1', '0') },
- { AV_CODEC_ID_MPEG1VIDEO, MKTAG('X', 'M', 'P', 'G') }, /* Xing MPEG intra only */
- { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
- { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
- { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
- { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
- { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
- { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
- { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
- { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') },
- { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
- { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
- { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
- { AV_CODEC_ID_AVRN, MKTAG('A', 'V', 'R', 'n') },
- { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
- { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
- { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
- { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */
- { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */
- { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */
- { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
- { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
- { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
- { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */
- { AV_CODEC_ID_MJPEG, MKTAG('M', 'M', 'J', 'P') },
- { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
- { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
- { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) },
- { AV_CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '2', '4') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', ' ', ' ') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', 'B') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', 'B') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('a', 'u', 'v', '2') },
- { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'Y', 'U') },
- { AV_CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
- { AV_CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
- { AV_CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
- { AV_CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
- { AV_CODEC_ID_V308, MKTAG('v', '3', '0', '8') },
- { AV_CODEC_ID_V408, MKTAG('v', '4', '0', '8') },
- { AV_CODEC_ID_AYUV, MKTAG('A', 'Y', 'U', 'V') },
- { AV_CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
- { AV_CODEC_ID_YUV4, MKTAG('y', 'u', 'v', '4') },
- { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
- { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
- { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
- { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
- { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
- { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
- { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
- { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
- { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
- { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
- { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
- { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
- { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') },
- { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
- { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
- { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
- { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
- { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
- { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
- { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
- { AV_CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) },
- { AV_CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) },
- { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
- { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
- { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
- { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
- { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
- { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
- { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
- { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
- { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
- { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
- { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
- { AV_CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') },
- { AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
- { AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
- { AV_CODEC_ID_FLV1, MKTAG('S', '2', '6', '3') },
- { AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
- { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
- { AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
- { AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
- { AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
- { AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
- { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
- { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
- { AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
- { AV_CODEC_ID_WMV3IMAGE, MKTAG('W', 'M', 'V', 'P') },
- { AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
- { AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
- { AV_CODEC_ID_VC1IMAGE, MKTAG('W', 'V', 'P', '2') },
- { AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
- { AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
- { AV_CODEC_ID_WNV1, MKTAG('Y', 'U', 'V', '8') },
- { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', '4') },
- { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
- { AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
- { AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
- { AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
- { AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
- { AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
- { AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
- { AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
- { AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') },
- { AV_CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
- { AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
- { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'C') },
- { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'K') },
- { AV_CODEC_ID_JPEG2000, MKTAG('I', 'P', 'J', '2') },
- { AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
- { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
- { AV_CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') },
- { AV_CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') },
- { AV_CODEC_ID_CLJR, MKTAG('C', 'L', 'J', 'R') },
- { AV_CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
- { AV_CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') },
- { AV_CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') },
- { AV_CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
- { AV_CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') },
- { AV_CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') },
- { AV_CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') },
- { AV_CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
- { AV_CODEC_ID_KGV1, MKTAG('K', 'G', 'V', '1') },
- { AV_CODEC_ID_LAGARITH, MKTAG('L', 'A', 'G', 'S') },
- { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '2') },
- { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '3') },
- { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '4') },
- { AV_CODEC_ID_AMV, MKTAG('A', 'M', 'V', 'F') },
- { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'A') },
- { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'G') },
- { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '0') },
- { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '2') },
- { AV_CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') },
- { AV_CODEC_ID_ESCAPE130, MKTAG('E', '1', '3', '0') },
- { AV_CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') },
- { AV_CODEC_ID_ZEROCODEC, MKTAG('Z', 'E', 'C', 'O') },
- { AV_CODEC_ID_Y41P, MKTAG('Y', '4', '1', 'P') },
- { AV_CODEC_ID_FLIC, MKTAG('A', 'F', 'L', 'C') },
- { AV_CODEC_ID_EXR, MKTAG('e', 'x', 'r', ' ') },
- { AV_CODEC_ID_MSS1, MKTAG('M', 'S', 'S', '1') },
- { AV_CODEC_ID_MSA1, MKTAG('M', 'S', 'A', '1') },
- { AV_CODEC_ID_TSCC2, MKTAG('T', 'S', 'C', '2') },
- { AV_CODEC_ID_MTS2, MKTAG('M', 'T', 'S', '2') },
- { AV_CODEC_ID_CLLC, MKTAG('C', 'L', 'L', 'C') },
- { AV_CODEC_ID_MSS2, MKTAG('M', 'S', 'S', '2') },
- { AV_CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
- { AV_CODEC_ID_NONE, 0 }
- };
【2】
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
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 Flags
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.
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
From: http://blog.csdn.net/tx3344/article/details/8259452
【多媒体封装格式详解】---ASF(WMV/WMA)相关推荐
- 【多媒体封装格式详解】---ASF(WMV/WMA)【2】完
4.the Data Object 这部分的内容就是asf文件中数据.Data Object 中包含着很多个 Data Packets.这些Data Packets里面就是音视频数据. 先来看看 Da ...
- 【多媒体封装格式详解】---ASF(WMV/WMA)【1】
ASF全称Advanced Systems Format 高级串流格式,微软出的一种开放封装格式的标准.它可以包含很多内容如:音视频.脚本命令.JPEG.二进制文件.或是由开发者自己定义的内容.常见的 ...
- 多媒体封装格式详解---MP4
MP4文件格式详解--结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成 ...
- [转]多媒体封装格式详解---MP4
原文 https://www.cnblogs.com/jingzhishen/p/3698570.html 参考 http://www.cnblogs.com/ranson7zop/p/7889272 ...
- 【多媒体封装格式详解】---MP4【1】
MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在"ISO/IEC 14496-14"标准文件中定义的. 1.最小组成单元 BOX 像FLV的tag.MKV的 ...
- 【多媒体封装格式详解】---MP4
[1] MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在"ISO/IEC 14496-14"标准文件中定义的. 1.最小组成单元 BOX 像FLV的tag. ...
- 常见音视频文件的编码和封装格式详解
常见的AVI.RMVB.MKV.ASF.WMV.MP4.3GP.FLV等⽂件其实只能算是⼀种封装标准. ⼀个完整的视频⽂件是由⾳频和视频2部分组成的.H264.Xvid等就是视频编码格式,MP3.AA ...
- MP4封装格式详解1
转载自:http://blog.chinaunix.net/uid-20758197-id-5056943.html MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在" ...
- F4V 封装格式详解(一)-------box
F4V 是Adobe公司推出的用于支持H.264/AAC的媒体格式,而FLV 格式主要是用来支持其他格式,如Sorensen Spark (H.263 )和On2 VP6. 1. F4V 文件格式: ...
最新文章
- Python零基础入门(2)——常用的快捷命令、数据类型、输入输出格式、变量介绍
- Java NIO 系列教程
- SAP运维和SAP实施有什么区别
- 如何理解拜占庭将军问题?
- 如何打造“智能助理”?阿里对话开发平台这样做
- java枚举使用详解
- SAP UI5 应用开发教程之九 - 创建第一个 Component
- jquery中点击切换的实现
- php 图片系统,Linger
- 832计算机专业基础,2019年考试科目832计算机组成原理与数据结构.doc
- springmvc配置不拦截静态资源
- 一款不错的图片自动向上翻滚的代码
- 【设计模式】建造者模式
- 移动端下拉刷新与页面内滑动冲突问题 iscroll 固定行表头 苹果下拉反弹
- 腾讯云轻量服务器蜂驰版测评及横向对比
- 【考研英语-基础-长难句】复合句_定语从句【先行词 关系词】【限定_非限定性定语从句】层层递进关系
- 计算机无法卸载软件,电脑软件无法卸载怎么解决 电脑卸载顽固软件超有用的三种方法...
- 深入浅出的英语口语700句zz
- 报错 System.ComponentModel.Win32Exception:拒绝访问,如何以管理员身份调试应用程序...
- mongodb数据库淘汰_Mongodb数据库学习
热门文章
- 抖音seo源码部署/开源不加密可二开/抖音seo优化源码
- JavaEE - Linux基本使用和程序部署
- 《中国金融市场大变局》
- 编程进阶:Java小白的序列化Serializable接口
- 天使投资人徐小平:最爱理性狂热创业者
- 一加手机的小众品牌困境
- Win10蓝屏BAD_POOL_CALLER解决方案(IRST)
- java的class文件反编译工具jad的应用
- 全球与中国1,2,4-丁三醇市场深度研究分析报告
- 历史上的今天:“超级计算机之父”诞生;三星推出移动支付;LibreOffice 发布...