ASF/WMV 文件格式解析

http://blog.csdn.net/lhzhang1985/article/details/6150337

http://blog.csdn.net/gyley2/article/details/8508869

http://blog.csdn.net/wms588/article/details/2235397

WMV,全称Windows Media Video,是微软为其开发的若干音视频编解码器推出的视频压缩文件格式。WMV,也是一种编解码器,最早 设计用于互联网流媒体应用,主要针对的竞争对手就是RealVideo

·    WMV已经是开放标准

2003年,微软基于其WMV9 codec编写了一份视频编解码规格书,并提交给SMPTE(美国影视技术人员协会)申请为标准。20063月份,该标准正式通过,正式标准名SMPTE 421M,其非正式名VC-1。自此,VC-1成为了支持BD-ROMHDDVD-ROM的三大视频编解码标准之一。

·    容器格式

很多人搞不清楚ASFWMV有什么区别。在大多数情况下,WMV文件都是用ASF容器格式来封装的。ASF,全称是AdvancedSystemFormat,也是微软专门针对流媒体开发的容器格式。使用.wmv扩展名的文件,代表这是一个使用WMV编解码器的ASF格式文件。一般来说,与WMV视频交织在一起的音频编码都是WMAWindows Media Audio)。当然也有例外,偶尔会使用ACELP.net音频编码。微软建议,如果ASF格式文件中包含了非微软的编解码器,最好使用.asf扩展名。

虽然WMV一般都是用ASF格式来封装,但是其也可以放入AVIMatroskaMKV)格式中,文件扩展名也相对应为.avi.mkv

·    视频质量

微软声称,WMV9的压缩比超过MPEG-42倍,MPEG-23倍。微软还声称,WMV 9的压缩效率相对WMV 8提高了15-50%。不过,20051月份的一份测试报告表明WMV 9的压缩效率比WMV 8要差。

·    WMV相关软件

很多软件都能播放WMV文件,比如WindowsMedia PlayerPowerDVDRealPlayerMPlayerVLCMedia PlayerZoomPlayerMediaPlayerClassic。能够对WMV进行编码的软件包括WindowsMovie MakerWindows Media EncoderMicrosoft Expression Encoder,以及AdobePremiere Pro。如果你有别的格式的文件,希望转换成WMV格式的视频文件,在PCZune上播放,那就去下载一个支持WMV转换的Video Converter,有支持所有格式转换的TotalVideoConverter,也有专门针对WMVWMVConverterVideoto ZuneConverter,到Google上搜索或者到download.com上查找,有很多。

下面来介绍ASF文件格式

什么是ASF
    ASF advancestreaming format的缩写。是微软为windows98所开发的串流多媒体文件格式。也是windows media的核心。
    ASF是一种数据格式,音频,视频,图像以及控制命令脚本等多媒体信息通过这种格式,以网络数据包的形式传输,实现流式多媒体内容发布。

ASF优势

体积小,适合网络传输
    数据组合形式灵活,可以将图形,声音和动画数据组合成一个ASF格式文件。也可以将其他格式的视频和音频转为ASF 格式等。
    ASF视频中可以带有命令代码,用户指定在到达视频或音频的某个时间后执行某个事件或操作。

 ASF特点

可扩展的媒体类型- ASF文件允许制作者很容易地定义新的媒体类型。ASF格式提供了非常有效的灵活地定义符合ASF文件格式定义的新的媒体流类型。任一存储的媒体流逻辑上都是独立于其他媒体流的,除非在文件头部分明显地定义了其与另一媒体流的关系。
    部件下载-特定的有关播放部件的信息(如,解压缩算法和播放器)能够存储在ASF 文件头部分,这些信息能够为客户机用来找到合适的所需的播放部件的版本---如果它们没有在客户机上安装。
    可伸缩的媒体类型- ASF 设计用来表示可伸缩的媒体类型的\"带宽\"之间的依赖关系。ASF 储各个带宽就像一个单独的媒体流。媒 体流之间的依赖关系存储在文件头部分,为客户机以一个独立于压缩的方式解释可伸缩的选项提供了丰富的信息流的优先级化- 现代的多媒体传输系统能够动态地调整以适应网络资源紧张的情况(如,带宽不足)。多媒体内容的制作者要能够根据流的优先级表达他们的参考信息,如最低保证音频流的传输。随着可伸缩媒体类型的出现,流的优先级的安排变得复杂起来,因为在制作的时候很难决定各媒体流的顺序。ASF允许内容制作者有效地表达他们的意见(有关媒体的优先级),甚至在可伸缩的媒体类型出现的情况下也可以.
    多语言- ASF设计为支持多语言。媒体流能 够可选地指示所含媒体的语言。这个功能常用于音频和文本流。一个多语言ASF文件指的是包含不同语言版本的同一内容的一系列媒体流,其允许 客户机在播放的过程中选择最合适的版本。
    目录信息- ASF提供可继续扩展的目录信息的功能,该功能的扩展性和灵活性都非常好。所有的目录信息都以无格式编码的 形式存储在文件头部分,并且支持多语言,如果需要,目录信息既可预先定义(,作者和标题),也可 以是制作者自定义。目录信息功能既可 以用于整个文件也可以用于单个媒体流。

 

Known GUIDs

struct GUID

{

    long v1;

    short v2;

    short v3;

    unsigned char v4[8];

    int operator==(const GUID& guid) const{return !memcmp(this, &guid, sizeof(GUID));}

};

 

/* GUID indicating audio stream header */

const GUID guid_audio_stream=

        { 0xF8699E40, 0x5B4D, 0x11CF, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B };

 

/* GUID indicating video stream header */

const GUID guid_video_stream=

        { 0xBC19EFC0, 0x5B4D, 0x11CF, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B };

ASF结构

 
    ASF 由三个主要部分组成。Header Object ,DataObject ,Index Object。

HeaderObject

     Header object的作用主要体现在 以下个方面:

     ASF文件开始提供了一个全局的GUID

       包含所有在data object中需要说明的信息。

      ASF的三层结构中,只有header object可以携带其他ASFobjects

          File properties object:包含全局文件信息。

          Stream properties object:定义了一个数字媒体码流和他的特征。

          Header extension object:支持为一个ASF文件添加新功能,以便向后兼容。

          Content Description Object:包含一些目录信息。

         Script command object 包含一些用户的指令。这些指令可以在playback时候被执行。

          Marker object:提供在一个文件 内的指定的跳跃点。(jump points

    注意:1)在header object中的objects可以以任何的顺序排列。

                  2)在一个header object中必须包含一个file properties object,一个header extension object 和至少一个streamproperties object。

Header Object是一个容器,它里面必须包含一个FilePropertiesObject, 一个HeaderExtension Object 和至少一个StreamProperties Object。

 

 

HeaderObject Fileproperties object

     Object ID:16字节唯一标识。A1 DC AB8C 47 A9 CF 11 8E E4 00 C0 0C 20 53 65

注意:所有的ASF对象和语法(包含data packet headers 都是以little-endian字节序。但是ASF文件的datapacket中包含的数字媒体流数据的字节序可以随意。

 

 

 

 

StreamProperties Object

a)  while循环从读入的数据中查找每个Stream Properties Object类型的128bitObject ID,(StreamProperties Object是流属性对象,定义一个媒体流和其属性),如果找到,返回找到的位置posff_asf_stream_header B7DC0791-A9B7-11CF-8EE6-00C00C205365(guid),16进制guid的顺序是9107DCB7-B7A9-CF11-8EE6-00C00C205365)这个标志代表了Stream Properties Object类型的Object ID

b)  获取16字节的StreamType字段,判断当前stream的类型(videoaudio)

i.  如果当前streamASF_Video_Media型,即Stream TypeBC19EFC0-5B4D-11CF-A8FD-00805F5C442B(guid),16进制guid的顺序是C0EF19BC-4D5B-CF11-A8FD-00805F5C442B,那么进行Video media type类型的Type-Specific Data数据解析。转第三层,BITMAPINFOHEADER 类型结构。

ii. 如果当前streamASF_Audio_Media类型,即Stream TypeF8699E40-5B4D-11CF-A8FD-00805F5C442B(guid),16进制guid的顺序是409E69F8-4D5B-CF11-A8FD-00805F5C442B,那么进行Audio media type类型的Type-Specific Data数据解析。转第三层,WAVEFORMATEX类型结构。

iii.当前streamASF_Command_Media型,即Stream Type59DACFC0-59E6-11D0-A3AC-00A0C90348F6(guid),16进制guid的顺序是C0CFDA59-E659-11D0-A3AC-00A0C90348F6。不做其他操作。

iv. 当前streamASF_Binary_Media型,即Stream Type3AFB65E2-47EF-40F2-AC2C-70A90D71D343(guid),16进制guid的顺序是E265FB3A-EF47-F240-AC2C-70A90D71D343,转第三层,ASF_Binary_Media类型。

c)  获取Type-SpecificData Length ,4字节。用来解析第三层的Type-Specific Data数据。

d)  跳过ErrorCorrection Data Length,4字节字段

e)  紧接着的16bit分别为StreamNumber(7)\Reserved(8bit,全为0)\EncryptedContent Flag(1bit,一般不设置,一旦设置,这个stream里得date就不解析),16bit与上0x7f之后,得到StreamNumber,即以后用到的video或者audiopid

f)  跳过Reserved4字节)字段,解析第三层的Type-Specific Data

 

3、第三层,Type-SpecificData。

Type-Specific Data的数据类型由Stream Type字段限定。根据不同的类型,各自有不同的Type-Specific Data结构。

a)ASF_Binary_Media类型。

这个类型结构体的参数基本不解析,除了Major media type31178C9D-03E1-4528-B582-3DF9DB22F503(guid),16进制guid的顺序是9D8C1731-E103-2845-B582-3DF9DB22F503的时候,类型为audio,会去解析这个结构体之后的参数。以ASF_Audio_Media方式解析。

Stream TypeASF_Binary_Media类型的。那么这个stream包含:StreamTypeASF_Binary_Media  型的。那么这个stream包含:

Majormediatype,128bit;

Media subtype,128bit;

Fixed-sizesamples,32bit;

Temporalcompression,32bit;

Sample size,32bit;

Format type,128bit;

Formatdatasize,32bit;

 

b) StreamType是ASF_Audio_Media类型的。那么这个stream使用WAVEFORMATEX 结构:

WAVEFORMATEX 定义音频数据格式

typedef struct

   WORD wFormatTag;//数据格式 如果包含在WAVEFORMATEXTENSIBLE中则必须为WAVE_FORMAT_EXTENSIBLE  

   WORD nChannels;//通道 通常为单通道,stereo data使用双通道 

   DWORD nSamplesPerSec;//采样输入率 hz 

   DWORD nAvgBytesPerSec; 

   WORD nBlockAlign; 

   WORD wBitsPerSample; 

   WORD cbSize;

} WAVEFORMATEX;

//WAVEFORMATEX 为波形音频流格式的数据结构,包括

//wFormatTag(16bit)设置波形声音的格式,nChannels(16bit)设置音频文件的通道数量,对于单声道的声音,此此值为1。对于立体声,此值为2.

//nSamplesPerSec(32bit)  设置每个声道播放和记录时的样本频率。

// 如果wFormatTag = WAVE_FORMAT_PCM,那么nSamplesPerSec通常为8.0kHz 11.025 kHz 22.05 kHz44.1kHz。例如对于采样率为11.025 kHz的音频,

//nSamplesPerSec 将被设为11025。对于非PCM格式的,请根据厂商的设定计算

//nAvgBytesPerSec(32bit)设置请求的平均数据传输率,单位byte/s。这个值对于创建缓冲大小是很有用的

//nBlockAlign(16bit),以字节为单位设置块对齐。块对齐是指最小数据的原子大小。

//如果wFormatTag = WAVE_FORMAT_PCMnBlockAlign (nChannels*wBitsPerSample)/8。对于非PCM格式请根据厂商的说明计算。

//wBitsPerSample(16bit)根据wFormatTag的类型设置每个样本的位深(即每次采样样本的大小,以bit为单位)。

//如果wFormatTag = WAVE_FORMAT_PCM,此值应该设为816,对于非PCM格式,根据厂商的说明设置。

//一些压缩的架构不能设置此值,此时wBitsPerSample应该为零

//cbSize(16bit),额外信息的大小,以字节为单位,额外信息添加在WAVEFORMATEX结构的结尾。

//这个信息可以作为非PCM格式的wFormatTag额外属性,如果wFormatTag不需要额外的信息,

//此值必需为0,对于PCM格式此值被忽略。

根据第二层的Type-SpecificData Length参数,设置每个样本的位深(即每次采样样本的大小,以bit为单位)并且可以判断是否要解析第三层中的cbSize和额外信息,如果Type-Specific Data Length14,每个样本的位深为8;其他情况下,位深未解析后面16bit的值得到的wBitsPerSample字段。如果Type-SpecificDataLength大于等于18,表明后面有额外信息,需要获取cbSize(16bit),额外信息的大小,以字节为单位,额外信息添加在WAVEFORMATEX结构的结尾。额外信息应该叫WAVEFORMATEXTENSIBLE结构。参看第四层的WAVEFORMATEXTENSIBLE结构说明。

4、 第四层

4-1、WAVEFORMATEXTENSIBLE结构,存在于WAVEFORMATEX结构的末尾Codec Specific Data字段。专用于ASF_Audio_Media.WAVEFORMATEXTENSIBLE,为了解决多声道排序和高精度数据的问题,Microsoft 定义了一个新的结构WAVE_FORMAT_EXTENSIBLE。此新结构不仅仅能够解决这些问题,而且还提供了一个自我注册新数据格式的机制。SubFormat字段设置为指定WAVE_FORMAT_EXTENSIBLE结构所描述数据类型的 GUIDWAVEFORMATEXTENSIBLE结构描述了一个多通道波形格式。这个结构是对WAVEFORMATEX的扩展,配置了已经由 WAVEFORMATEXcbSize成员支持的额外字节。当需要WAVEFORMATEX的地方,WAVEFORMATEXTENSIBLE结构能够被转化为WAVEFORMATEX

typedef struct

{

   WAVEFORMATEX  Format;

   union

    {

       WORD wValidBitsPerSample;

       WORD wSamplesPerBlock;

       WORD wReserved;

   }Samples;

   DWORD dwChannelMask;

   GUID  SubFormat;

} WAVEFORMATEXTENSIBLE;

通过wValidBitsPerSampledwChannelMask字段可以获得编码方式码。通过编码方式码,可以确定一帧的数据大小和最终的编码方式。

4-2、BITMAPINFOHEADER 类型结构,专用于ASF_Video_Media.主要用来解析视频每一帧的宽高和每一像素的位深,还有编码方式与video_pid.

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值