【多媒体封装格式详解】

您所在的位置:网站首页 wma格式是音频还是视频 【多媒体封装格式详解】

【多媒体封装格式详解】

2024-06-01 04:02| 来源: 网络整理| 查看: 265

【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 GUID16Object Size8Object 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  [cpp]  view plain copy 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

TagDescription00x0000Unknown10x0001Microsoft PCM20x0002Microsoft ADPCM30x0003IEEE Float40x0004Compaq VSELP50x0005IBM CVSD60x0006Microsoft ALAW70x0007Microsoft MULAW160x0010OKI ADPCM170x0011Intel DVI ADPCM180x0012Videologic MediaSpace ADPCM190x0013Sierra ADPCM200x0014Antex Electronics G.723 ADPCM210x0015DSP Solution DIGISTD220x0016DSP Solution DIGIFIX230x0017Dialogic OKI ADPCM240x0018MediaVision ADPCM250x0019HP CU320x0020Yamaha ADPCM330x0021Speech Compression Sonarc340x0022DSP Group True Speech350x0023Echo Speech EchoSC1360x0024Audiofile AF36370x0025APTX380x0026AudioFile AF10390x0027Prosody 1612400x0028LRC480x0030Dolby AC2490x0031Microsoft GSM610500x0032Microsoft MSNAudio510x0033Antex ADPCME520x0034Control Res VQLPC530x0035Digireal540x0036DigiADPCM AC2550x0037Control Res CR10560x0038NMS VBXADPCM AC2570x0039Roland RDAC580x003AEchoSC3590x003BRockwell ADPCM600x003CRockwell Digit LK610x003DXebec640x0040Antex Electronics G.721650x0041Antex Electronics G.728 CELP660x0042Microsoft MSG723800x0050MPEG820x0052Voxware RT24830x0053InSoft PAC850x0055MPEG Layer 3890x0059Lucent G.723960x0060Cirrus970x0061ESPCM980x0062Voxware990x0063Canopus Atrac1000x0064APICOM G.726 ADPCM1010x0065APICOM G.722 ADPCM1020x0066Microsoft DSAT1030x0067Microsoft DSAT Display1050x0069Voxware Byte Aligned1120x0070Voxware AC81130x0071Voxware AC101140x0072Voxware AC161150x0073Voxware AC201160x0074Voxware Metavoice1170x0075Voxware Metasound1180x0076Voxware RT29HW1190x0077Voxware VR121200x0078Voxware VR181210x0079Voxware TQ401280x0080Softsound1290x0081Voxware TQ601300x0082MSRT241310x0083AT&T G.729A1320x0084Motion Pixels MVI MV121330x0085DF G.7261340x0086DF GSM6101360x0088ISIAudio1370x0089Onlive1450x0091Siemens SBC241460x0092Dolby AC3 SPDIF1510x0097ZyXEL ADPCM1520x0098Philips LPCBB1530x0099Packed2560x0100Rhetorex ADPCM2570x0101BeCubed IRAT2730x0111Vivo G.7232740x0112Vivo Siren2910x0123DEC G.7235120x0200Creative ADPCM5140x0202Creative FastSpeech85150x0203Creative FastSpeech105440x0220Quarterdeck7680x0300Fujitsu FM Towns Snd10240x0400BTV Digital16640x0680AT&T VME VMPCM40960x1000Olivetti OLIGSM40970x1001Olivetti OLIADPCM40980x1002Olivetti OLICELP40990x1003Olivetti OLISBC41000x1004Olivetti OLIOPR43520x1100LH Codec51200x1400Norris51210x1401AT&T ISIAudio53760x1500AT&T Soundspace Music Compression81920x2000DVM655340xFFFEWAVE_FORMAT_EXTENSIBLE655350xFFFFExperimental

附表3

[cpp]  view plain copy 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  我们找到上面那个文件的第一个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操作。

 From: http://blog.csdn.net/tx3344/article/details/8259452



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3