常见音频编码格式解析

文章目录

1、MP3编码格式

1.1. MP3概述

MPEG-1 or MPEG-2 Audio Layer III是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III),简称为MP3,是目前最流行的音频编码格式。

MP3文件是由帧(frame)构成的,帧是MP3文件最小的组成单位。MPEG音频文件是MPEG1标准中的声音部分,也叫MPEG音频层,它根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG音频编码的层次越高,编码器越复杂,压缩率也越高,MP1和MP2的压缩率分别为4:1和6:1-8:1,而MP3的压缩率则高达10:1-12:1,也就是说,一分钟CD音质的音乐,未经压缩需要10MB的存储空间,而经过MP3压缩编码后只有1MB左右。不过MP3对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。根据MPEG规范的说法,MPEG-4中的AAC(Advanced audio coding)将是MP3格式的下一代。

1.2. MPEG音频压缩基础

在众多音频压缩方法中,这些方法在保持声音质量的同时尽量压缩数字音频使之占用更小的存储空间。MPEG压缩是该领域中效果最好的一个。这种压缩是有损压缩,这意味着,当运用这一方法压缩时肯定会丢失一部分音频信息。但是,由于压缩方法的控制很难发现这种损失。使用几个非常复杂和苛刻的数学算法,使得只有原始音频中几乎听不到的部分损失掉。这就给重要的信息剩下了更多的空间。通过这种方法可以将音频压缩12倍(可以选择压缩率),效果显著。正是应为他的质量,MPEG音频变得流行起来。

MPEG-1,MPEG-2和MPEG-4都是人们熟悉的MPEG标准,MP3只涉及到前两中,另外还有一个非官方标准MPEG-2.5用于扩展MPEG-2/LSF到更低的采样率。

MPEG-1音频(ISO/IEC 11172-3)描述了具有如下属性的三层音频编码:

  • 1或2个声道;
  • 采样频率为32kHz,44.1kHz或48kHz;
  • 位率从32kbps到448kbps;

每一层都有自己的优点。

MPEG-2音频(ISO/IEC 13818-3)有两个MPEG-1的扩展,通常叫做MPEG-2/LSF和MPEG-2/Multichannel。

MPEG-2/LSF有如下特点:

  • 1或2个声道;
  • 采样频率为MPEG-1的一半;
  • 波特率从8kbps256kbps;

MPEG-2/Mutichannel有如下特点:

  • 多达5个声道和1个LFE-通道(低频增强 不是重低音);
  • 同MPEG-1一样的采样频率;
  • 5.1的最高波特率可能达到1Mbps;

1.3. MPEG Layer3编/解码的基本原理

音乐CD具有44.1KHz 16Bits立体声的音频质量,一张CD可以存储74分钟的歌曲(大约15首左右)。如何将这些歌曲无损或基本无损地进行压缩,以使在同样的媒体上存储更多的歌曲,一直困扰着软件业。当MPEG协会提出MPEG Audio Layer1~Layer3后,机会产生了。通过使用MPEG1 Layer3编码技术,制作者得以用大约12∶1的压缩率记录16KHz带宽的有损音乐信号。不过,同CD原声区别不大。人的听力系统具有非常优越的性能,其动态范围超过96dB。你既可以听到扣子掉在地上这样小的声音,也可以听到波音747的强大的轰鸣声。但当我们站在飞机场听着波音747的轰鸣时,你还能分辨出扣子掉在地上的声音吗?不可能。人的听力系统适应声音的动态变化,人们对这种适应及屏蔽特性音质研究后得出对声音压缩非常有用的理论。人们很早以前就知道利用这种特性来为磁带录音降低噪音了(当没有音乐时嘶嘶声很容易听到,而当音乐信号电平很高时嘶嘶声不容易听到)。当声音较强时产生屏蔽效应。在阈值曲线下的噪音或小信号声音无法被人耳听到。在较强信号出现时,允许通过更多的信号。在此时增加被量化过的小信号数据(使用无用的位来携带更多的信息)可以达到一定程度的压缩的目的。通常情况下,MP3压缩器将原始声音通过FFT(快速傅立叶变换)变化到频域,然后通过一定的算法算出何种频率声音可以携带更多的信息。而在还原时解码器所需要做的仅仅是将其从频域再变换回来。

1.4. 整个MP3文件结构

MP3文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)

表格 1-1

section description
ID3V2 在文件开始的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量
Frame
.
.
.
Frame
一系列的帧,在文件的中间位置,个数由文件大小和帧长决定;
每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定;
每个FRAME又分为帧头和数据实体两部分;
帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。

1.4.1. ID3V2

ID3V2到现在一共有4个版本,但流行的播放软件一般只支持第3版,即ID3v2.3。由于ID3V1记录在MP3文件的末尾,ID3V2就只好记录在MP3文件的首部了(如果有一天发布ID3V3,真不知道该记录在哪里)。也正是由于这个原因,对ID3V2的操作比ID3V1要慢。而且ID3V2结构比ID3V1的结构要复杂得多,但比前者全面且可以伸缩和扩展。

下面就介绍一下ID3V2.3:

每个ID3V2.3的标签都由一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3文件的首部。

(一)标签头

在文件的首部顺序记录10个字节的ID3V2.3的头部。数据结构如下:

char Header[3];     //必须为"ID3"否则认为标签不存在
char Ver;       //版本号 ID3V2.3就记录3
char Revision;     //副版本号 此版本记录为0
char Flag;       //存放标志的字节,这个版本只定义了三位,稍后详细解说
char Size[4];      //标签大小,包括标签头的10 个字节和所有的标签帧的大小

注:对这里我有疑惑,因为在实际寻找首帧的过程中,我发现有的mp3文件的标签大小是不包含标签头的,但有的又是包含的,可能是某些mp3编码器写标签的BUG,所以为了兼容只好认为其是包含的,如果按大小找不到,再向后搜索,直到找到首帧为止。

这里写图片描述
                  图 1-1

蓝色部分即为ID3V2.3的头部:前4个字节就是ID30x03(第3版)

第5个字节:副版本号,为0

注:文中关于mp3文件数据截图均为“紫藤花.mp3”文件中的数据截图。

(1)标志字节

标志字节一般为0,定义如下:

abc00000

a – 表示是否使用Unsynchronisation(一般不设置)
b – 表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置
c – 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)

上图蓝色部分第6个字节:存放标志的字节,只定义了三位,这里值为0。

(2)标签大小

一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下:

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小,计算公式如下:

int total_size;
total_size = (Size[0]&0x7F)*0x200000 + (Size[1]&0x7F)*0x4000 + (Size[2]&0x7F)*0x80 + (Size[3]&0x7F)

上图蓝色部分第7到10字节:表示ID3标签的大小,这里为

total_size =(0x00&0x7F)*0x200000 + (0x00&0x7F)*0x4000 + (0x10&0x7F)*0x80 + (0x72 &0x7F) = 0x872 = 2162

(二)标签帧

每个标签帧都由一个10个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头及其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中得到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。

帧头的定义如下:

char ID[4];    /用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表/
char Size[4];   /帧内容的大小,不包括帧头,不得小于1/
char Flags[2];   /存放标志,只定义了6位,稍后详细解说/

这里写图片描述
                  图 1-2

蓝色部分是一个歌曲标题的标签帧

(1)帧标识

用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:

TIT2 = 标题   //表示内容为这首歌的标题,下同
TPE1=作者
TALB=专集
TRCK=音轨    //格式:N/M其中N 为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
TYER=年代   //是用ASCII 码表示的数字
TCON=类型   //直接用字符串表示
COMM=备注   //格式:“eng\0备注内容”,其中eng表示备注所使用的自然语言

注:前4个字节为帧标识,这里是54 49 54 32(TIT2)是标题的标签帧。

表1-2 标签帧的标识以及其意义对照表

index content index content
AENC [Audio encryption] TKEY [Initial key]
APIC [Attached picture] TLAN [Language(s)]
COMM [Comments] TLEN [Length]
COMR [Commercial frame] TMED [Media type]
ENCR [Encryption method registration] TOAL [Original album/movie/show title]
EQUA [Equalization] TOFN [Original filename]
ETCO [Event timing codes] TOLY [Original lyricist(s)/text writer(s)]
GEOB [General encapsulated object] TOPE [Original artist(s)/performer(s)]
GRID [Group identification registration] TORY [Original release year]
IPLS [Involved people list] TOWN [File owner/licensee]
LINK [Linked information] TPE1 [Lead performer(s)/Soloist(s)]
MCDI [Music CD identifier] TPE2 [Band/orchestra/accompaniment]
MLLT [MPEG location lookup table] TPE3 [Conductor/performer refinement]
OWNE [Ownership frame] TPE4 [Interpreted, remixed, or otherwise modified by]
PRIV [Private frame] TPOS [Part of a set]
PCNT [Play counter] TPUB [Publisher]
POPM [Popularimeter] TRCK [Track number/Position in set]
POSS [Position synchronisation frame] TRDA [Recording dates]
RBUF [Recommended buffer size] TRSN [Internet radio station name]
RVAD [Relative volume adjustment] TRSO [Internet radio station owner]
RVRB [Reverb] TSIZ [Size]
SYL [Synchronized lyric/text] TSRC [ISRC (international standard recording code)]
SYTC [Synchronized tempo codes] TSSE [Software/Hardware and settings used for]
TALB [Album/Movie/Show title] TYER [Year]
TBPM [BPM (beats per minute)] TXXX [User defined text information frame]
TCOM [Composer] UFID [Unique file identifier]
TCON [Content type] USER [Terms of use]
TCOP [Copyright message] USLT [Unsychronized lyric/text transcription]
TDAT [Date] WCOM [Commercial information]
TDLY [Playlist delay] WCOP [Copyright/Legal information]
TENC [Encoded by] WOAF [Official audio file webpage]
TEXT [Lyricist/Text writer] WOAR [Official artist/performer webpage]
TFLT [File type] WOAS [Official audio source webpage]
TIME [Time] WORS [Official internet radio station homepage]
TIT1 [Content group description] WPAY [Payment]
TIT2 [Title/songname/content description] WPUB [Publishers official webpage]
TIT3 [Subtitle/Description refinement] WXXX [User defined URL link frame]

(2)大小

这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下:

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

算法如下:

int FSize;
FSize = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 + Size[3];

第5到8字节为标签帧的大小,这里为

FSize = 0x00*0x100000000+ 0x00*0x10000 + 0x00*0x100 + 0x24 = 0x24 = 36

注意:这里的帧大小,并不包含帧头的10个字节,只表示帧内容的大小。

(3)标志

只定义了6位,另外的10位为0,但大部分的情况下16位都为0就可以了。格式如下:abc00000ijk00000

  • a – 标签保护标志,设置时认为此帧作废
  • b – 文件保护标志,设置时认为此帧作废
  • c – 只读标志,设置时认为此帧不能修改
  • i – 压缩标志,设置时一个字节存放两个BCD码表示数字
  • j – 加密标志
  • k – 组标志,设置时说明此帧和其他的某帧是一组

值得一提的是winamp在保存和读取帧内容的时候会在内容前面加个’‘\0’',并把这个字节计算在帧内容的大小中。

第9到10字节为标签帧的标记,如上所述,这里为00。

帧内容是歌曲标题,标题的36个字节的内容为:紫藤花☆ゞ忍音.地带[renyin.12u.cn]。

1.4.2. 音频数据帧

每个帧都有一个帧头Header,长度是4Byte(32bit),帧头后面可能有两个字节的CRC 校验值,这两个字节的校验值是否存在决定于Header信息的第16bit,为1则帧头后面无校验,为0则有校验,校验值长度为2个字节,紧跟在Header后面的就是帧的实体数据,也就是压缩的声音数据,当解码器读到此处时就进行解码了。格式如下:

(1)帧头格式

帧头长4字节,对于固定位率的MP3文件,所有帧的帧头(即CBR帧头)格式一样,其数据结构如下(注:此结构要自己定义):

typedef struct frameHeader
{
	unsigned int sync: 11;					//同步信息
    unsigned int version: 2;				  //版本
	unsigned int layer: 2;					//层
	unsigned int error protection: 1;		 // CRC校验
	unsigned int bitrate_index: 4;			//位率
	unsigned int sampling_frequency: 2;	   //采样频率
	unsigned int padding: 1;			      //帧长调节
	unsigned int private: 1;				  //保留字
	unsigned int mode: 2;					 //声道模式
	unsigned int mode extension: 2;		   //扩充模式
	unsigned int copyright: 1;				//版权
	unsigned int original: 1;				 //原版标志
	unsigned int emphasis: 2;				 //强调模式
}FHEADER, *LPHEADER;

表1-3 MP3帧头字节使用说明

 
名字 位长 说明
同步信息 11 第1、2字节 所有位均为1,第1字节恒为FF。
版本 2 00-MPEG2.5 01-未定义  10-MPEG 2  11-MPEG 1
2 00-未定义  01-Layer 3  10-Layer 2  11-Layer 1
CRC校验 1 0-校验  1-不校验
位率 4 第3字节 取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。 
bits V1,L1 V1,L2 V1,L3 V2,L1 V2,L2 V2,L3
0000 free free free free free free
0001 32 32 32 32(32) 32(8) 8(8)
0010 64 48 40 64(48) 48(16) 16(16)
0011 96 56 48 96(56) 56(24) 24(24)
0100 128 64 56 128(64) 64(32) 32(32)
0101 160 80 64 160(80) 80(40) 60(40)
0110 192 96 80 192(96) 96(48) 80(48)
0111 224 112 96 224(112) 112(56) 56(56)
1000 256 128 112 256(128) 128(64) 64(64)
1001 288 160 128 288(144) 160(80) 128(80)
1010 320 192 160 320(160) 192(96) 160(96)
1011 352 224 192 352(176) 224(112) 112(112)
1100 384 256 224 384(192) 256(128) 128(128)
1101 416 320 256 416(224) 320(114) 256(114)
1110 448 384 320 448(256) 384(160) 320(160)
1111 bad bad bad bad bad bad
V1 - MPEG 1  V2 - MPEG 2 and MPEG 2.5 L1 - Layer 1   L2 - Layer 2  L3 - Layer 3 "free" 表示位率可变   "bad" 表示不允许值
采样率 2 采样频率,对于MPEG-1: 00-44.1kHz 01-48kHz 10-32kHz 11-未定义 对于MPEG-2: 00-22.05kHz 01-24kHz 10-16kHz 11-未定义 对于MPEG-2.5: 00-11.025kHz 01-12kHz 10-8kHz 11-未定义
帧长调节 1 用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。
保留字 1 没有使用。
声道模式 2 第4字节 表示声道, 00-立体声Stereo 01-Joint Stereo      10-双声道Dual channel 11-单声道Single channel 
扩充模式 2 当声道模式为01是才使用。
Value 强度立体声 MS立体声
00 off off
01 on off
10 off on
11 on on
版权 1 文件是否合法,0-不合法 1-合法
原版标志 1 是否原版,0-非原版 1-原版
强调方式 2 用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。 00-未定义 01-50/15ms 10-保留 11-CCITT J.17

注意:关于读取帧头也可以使用下面的方法

定义一个结构体:

typedef struct frameHeader
{
unsigned int sync1:8; 				//同步信息1

unsigned int error_protection:1; 		//CRC校验
unsigned int layer:2; 				//层
unsigned int version:2; 				//版本
unsigned int sync2:3; 				//同步信息2

unsigned int extension:1; 			//版权
unsigned int padding:1;				 //填充空白字
unsigned int sample_rate_index:2; 	//采样率索引
unsigned int bit_rate_index:4; 		//位率索引

unsigned int emphasis:2; 			//强调方式
unsigned int original:1; 				//原始媒体
unsigned int copyright:1; 			//版权标志
unsigned int mode_extension:2; 		//扩展模式,仅用于联合立体声
unsigned int channel_mode:2; 		//声道模式

}FHEADER, *pFHEADER;

请注意该结构体将同步信息分成了两个部分,而且其他的位的顺序也和上表列出的有所差别,这个主要是因为c语言在存取数据时总是从低位开始,而这个帧头是需要从高位来读取的。
读取方式如下:

FHEADER header;

  • 40
    点赞
  • 284
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
功能强大且易于使用的标签软件,可让您分类和管理 Ogg Vorbis,MP3,FLAC,Speex,Musepack,Windows Media,WavPack 和 Monkey Audio 文件。MetatOGGer 是一款功能全面的软件应用程序,旨在管理您的音乐收藏,包括标记,重命名和组织 OGG 和 MP3 格式的音轨。它主要针对具有此类应用程序背景的用户。 音频文件标签编辑器 Metatogger 中文版 音频文件标签编辑器 Metatogger 中文版 Metatogger 允许您更正或完成音频文件的标签。为此,它具有允许更正或完成音频文件标签的功能: 批量编辑标签,并支持多个标签(具有多个值的单个标签)和包含换行符的标签; 使用C#脚本自动执行所有类型的处理:替换字符,更改标签大小写等; 从文件名或路径获取标签; 根据标签的值重命名,复制(物理或符号)或移动音频文件; 根据标签的值对文件夹中的音频文件进行分类(复制,移动,符号链接); 在包含250万张光盘的本地数据库中搜索要标记的音频文件,其数据来自在线百科全书 MusicBrainz,以自动提取包括曲目号在内的信息; 在 archive.org 上搜索光盘封面,然后将它们添加为标签或将其复制到存储音频文件的文件夹中; 使用 Acoustid 技术分析其声学指纹后,自动找到歌手的姓名和歌曲名称; 使用 Acoustid 声学指纹识别技术来识别可能重复的音频文件,即使它们并非严格相同(编码参数,文件格式等); 快速删除不良标签。 该实用程序的界面干净直观。通过使用文件浏览器,文件夹视图或“拖放”方法,可以将音频轨道导入工作空间。您可以根据需要添加任意数量的项目。 对于列表中的每首歌曲,您都可以查看艺术家,标题,日期,专辑,流派和曲目号,也可以通过单击任意字段来编辑它们。 MetatOGGer 的一项重要功能使您可以应用量身定制的标签,而您所要做的就是写下名称和值。 此外,您可以查看文件的音频属性(例如,编解码器,持续时间,比特率,通道模式,采样率),添加封面(嵌入式和外部)以及使用 IronPython 脚本编辑标签(例如,转换为大写字母,修剪空白) ,将首字母大写)。 MetatOGGer 的其他功能使您可以从声学指纹中获取标签,下载歌词,复制封面,查找重复文件,播放曲目并将标签导入为关键字。还可以删除所需的任何标签(例如,常见,不常见,嵌入的图片)并创建包含或排除列表,从文件名称或路径中获取标签,以及根据文件的标签对文件进行重命名和排序等。 。 MetatOGGer 提供多语言支持,可让您自定义快速访问工具栏和跟踪列,并使您可以将所有设置恢复为其出厂值。它具有良好的响应时间,并使用了中度到大量的 CPU 和系统内存。 在整个评估过程中,我们没有遇到任何问题。如您所见,MetatOGGer 捆绑了许多与音频标记有关的选项和配置设置,在此领域中,作为功能强大的应用程序绝对值得考虑。
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4 调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5 DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2 缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1 创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4 系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3 封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159 4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2 DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167 5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169 5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174 5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188 第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2 启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1 声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215 6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK 220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224 7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1 DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4 DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268 7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器 295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3 界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3 图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4 升级你的播放器 321 8.4.1 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片 328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1 系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置 336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现 340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2 GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4 系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章 VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373 10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数 376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3 使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台 387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417 11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4 编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE 2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439 12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3 使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3 使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2 哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5 CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5 本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2 DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488 13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3 算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2 使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化 507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2 XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2 MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559 14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3 CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码 565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3 H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2 X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1 VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4 系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1 对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放 636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 因先前网友反映先前版本(11分卷版)分卷数量太多导致解压经常出错,因本人上传权限为100MB,先已重新压缩上传为2分卷版,感谢各位网友的支持。 本下载链接为分卷2,总共两个分卷 分卷1地址为: http://download.csdn.net/detail/a7952113/4785478 本分卷由2345好压(Haozip)生成,请使用2345好压来解压。 2345好压下载地址:http://www.haozip.com/ 分卷文件共有以下2个: Visual.Cpp音频视频处理技术及工程实践.haozip01.zip Visual.Cpp音频视频处理技术及工程实践.haozip02.zip

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值