【多媒体封装格式详解】---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组成的。

FieldSize (bytes)
Object GUID16
Object Size8
Object Datavaries (≥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]的结构如下:

字节 描述 字节序
324数据1原生
162数据2原生
162数据3原生
648数据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 文件整体结构

从ASF文件整体来看是由3大部分组成: Header Object, the Data Object, the Index Object(s).


Header Object, Data Object都是必须有的,而且 Header Object在ASF文件头部,紧跟着是 the Data Object
Index Object(s)是可选的,存在ASF文件尾部 ,Index Object(s)对seek以及快进快退的操作非常重要。
刚才那个例子可以看一下,这3大部分都有

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 你可以获得整个文件大小 时长等信息。上面例子对应解析出来的
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 

包含的是文件中流的关键信息,通过对这部分内容你可以获知asf文件中包含几个音视频流,每个流相对应的基本信息。比如视频的宽高、音频的采样率等。

根据  Stream Type GUID的值来判断流的类型,参看附表。然后具体信息装在 Type-Specific Data 
来看看上面的例子


红框中的GUID表示  B7DC0791-A9B7-11CF-8EE6-00C00C205365 表示的就是  Stream Properties Object 。size = 0x72
紧跟着绿色框里面就是  Stream Type F8699E40-5B4D-11CF-A8FD-00805F5C442B 查表可知 类型是 ASF_Audio_Media 。也就是音频的信息。
Type-Specific Data Length 长度为 0x1c 
蓝色框里面的就是Type-Specific Data  61 01 02 00 44 AC 00 00 45 1F-00 00 CF 05 10 00 0A 00 00 00 01 00 0F 00 78 2E-00 00
因为是音频  Type-Specific Data  就是按照WAVEFORMATEX structure 保存。下面的表格来解析 Type-Specific Data 
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 表示asf文件中包含的codec信息。

Object ID 86D15240-311D-11D0-A3A4-00A0C90348F6 
Object Size 226  ( 0xE2 )  
 
Codec ID Reserved 2  
Codecs
Name Description Type Format / FourCC Info Size Info 
"Windows Media Audio V2" " 64 kbps, 44 kHz, stereo" WMT_CODECINFO_AUDIO 353 2 0000: 61 01                                             a  
"Microsoft MPEG-4 Video Codec V3" "" WMT_CODECINFO_VIDEO MP43 4 TEXT: MP43
0000: 4D 50 34 33                                       MP43
 

这个之前  Stream Properties Object 解析后的信息一致。

未完待续......

附表1






附表2

TagDescription
00x0000Unknown
10x0001Microsoft PCM
20x0002Microsoft ADPCM
30x0003IEEE Float
40x0004Compaq VSELP
50x0005IBM CVSD
60x0006Microsoft ALAW
70x0007Microsoft MULAW
160x0010OKI ADPCM
170x0011Intel DVI ADPCM
180x0012Videologic MediaSpace ADPCM
190x0013Sierra ADPCM
200x0014Antex Electronics G.723 ADPCM
210x0015DSP Solution DIGISTD
220x0016DSP Solution DIGIFIX
230x0017Dialogic OKI ADPCM
240x0018MediaVision ADPCM
250x0019HP CU
320x0020Yamaha ADPCM
330x0021Speech Compression Sonarc
340x0022DSP Group True Speech
350x0023Echo Speech EchoSC1
360x0024Audiofile AF36
370x0025APTX
380x0026AudioFile AF10
390x0027Prosody 1612
400x0028LRC
480x0030Dolby AC2
490x0031Microsoft GSM610
500x0032Microsoft MSNAudio
510x0033Antex ADPCME
520x0034Control Res VQLPC
530x0035Digireal
540x0036DigiADPCM AC2
550x0037Control Res CR10
560x0038NMS VBXADPCM AC2
570x0039Roland RDAC
580x003AEchoSC3
590x003BRockwell ADPCM
600x003CRockwell Digit LK
610x003DXebec
640x0040Antex Electronics G.721
650x0041Antex Electronics G.728 CELP
660x0042Microsoft MSG723
800x0050MPEG
820x0052Voxware RT24
830x0053InSoft PAC
850x0055MPEG Layer 3
890x0059Lucent G.723
960x0060Cirrus
970x0061ESPCM
980x0062Voxware
990x0063Canopus Atrac
1000x0064APICOM G.726 ADPCM
1010x0065APICOM G.722 ADPCM
1020x0066Microsoft DSAT
1030x0067Microsoft DSAT Display
1050x0069Voxware Byte Aligned
1120x0070Voxware AC8
1130x0071Voxware AC10
1140x0072Voxware AC16
1150x0073Voxware AC20
1160x0074Voxware Metavoice
1170x0075Voxware Metasound
1180x0076Voxware RT29HW
1190x0077Voxware VR12
1200x0078Voxware VR18
1210x0079Voxware TQ40
1280x0080Softsound
1290x0081Voxware TQ60
1300x0082MSRT24
1310x0083AT&T G.729A
1320x0084Motion Pixels MVI MV12
1330x0085DF G.726
1340x0086DF GSM610
1360x0088ISIAudio
1370x0089Onlive
1450x0091Siemens SBC24
1460x0092Dolby AC3 SPDIF
1510x0097ZyXEL ADPCM
1520x0098Philips LPCBB
1530x0099Packed
2560x0100Rhetorex ADPCM
2570x0101BeCubed IRAT
2730x0111Vivo G.723
2740x0112Vivo Siren
2910x0123DEC G.723
5120x0200Creative ADPCM
5140x0202Creative FastSpeech8
5150x0203Creative FastSpeech10
5440x0220Quarterdeck
7680x0300Fujitsu FM Towns Snd
10240x0400BTV Digital
16640x0680AT&T VME VMPCM
40960x1000Olivetti OLIGSM
40970x1001Olivetti OLIADPCM
40980x1002Olivetti OLICELP
40990x1003Olivetti OLISBC
41000x1004Olivetti OLIOPR
43520x1100LH Codec
51200x1400Norris
51210x1401AT&T ISIAudio
53760x1500AT&T Soundspace Music Compression
81920x2000DVM
655340xFFFEWAVE_FORMAT_EXTENSIBLE
655350xFFFFExperimental

附表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 }
};



  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值