精华内容
下载资源
问答
  • 常见的声音、图像、视频压缩基本都是有损的。 在多媒体应用中,常见的压缩方法有:PCM(脉冲编码调制 有损压缩 ),预测编码,变换编码,插值和外推法,统计编码,矢量量化和子带编码等,混合编码是广泛采用的方法...

    概述

    有损压缩,在台湾、港澳又称作破坏性资料压缩,

    常见的声音、图像、视频压缩基本都是有损的。

    在多媒体应用中,常见的压缩方法有:PCM(脉冲编码调制

    有损压缩有损压缩

    ),预测编码,变换编码,插值和外推法,统计编码,矢量量化和子带编码等,混合编码是广泛采用的方法。

    mp3 、divX 、Xvid 、jpeg、 rm 、rmvb、 wma 、wmv等都是有损压缩。

    有损数据压缩方法是经过压缩、解压的数据与原始数据不同但是非常接近的压缩方法。有损数据压缩又称破坏型压缩,即将次要的信息数据压缩掉,牺牲一些质量来减少数据量,使压缩比提高。这种方法经常用于因特网尤其是流媒体以及电话领域。在这篇文章中经常成为编解码。它是与无损数据压缩对应的压缩方法。根据各种格式设计的不同,有损数据压缩都会有generationloss:压缩与解压文件都会带来渐进的质量下降。

    人眼或人耳能够察觉的有损压缩带来的缺陷称为压缩失真(en:compressionartifact)。

    无损压缩

    无损压缩是对文件本身的压缩,和其它数据文件的压缩一样,是对文件的数据存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容,对于数码图像而言,也就不会使图像细节有任何损失。

    基本原理是相同的颜色信息只需保存一次。压缩图像的软件首先会确定图像中哪些区域是相同的,哪些是不同的。包括了重复数据的图像(如蓝天) 就可以被压缩,只有蓝天的起始点和终结点需要被记录下来。但是蓝色可能还会有不同的深浅,天空有时也可能被树木、山峰或其他的对象掩盖,这些就需要另外记录。从本质上看,无损压缩的方法可以删除一些重复数据,大大减少要在磁盘上保存的图像尺寸。但是,无损压缩的方法并不能减少图像的内存占用量,这是因为,当从磁盘上读取图像时,软件又会把丢失的像素用适当的颜色信息填充进来。如果要减少图像占用内存的容量,就必须使用有损压缩方法。

    有损压缩的特点是保持颜色的逐渐变化,删除图像中颜色的突然变化。

    类型

    有损变换编解码

    首先对图像或者声音进行采样、切成小块、变换到一个新的空间、量化,然后对量化值进行熵编码。

    预测编解码

    先前的数据以及随后解码数据用

    有损压缩有损压缩

    来预测当前的声音采样或者图像帧,预测数据与实际数据之间的误差以及其它一些重现预测的信息进行量化与编码。

    有些系统中同时使用这两种技术,变换编解码用于压缩预测步骤产生的误差信号。

    优点与不足

    有损方法的一个优点就是在有些情况下能够获得比任何已知无损方法小得多的文件大小,同时又能满足系统的需要。当用户得到有损压缩文件的时候,譬如为了节省下载时间,解压文件与原始文件在数据位的层面上看可能会大相径庭,但是对于多数实用目的来说,人耳或者人眼并不能分辨出二者之间的区别。

    有损方法经常用于压缩声音、图像以及视频。

    有损视频编解码几乎总能达到比音频或者静态图像好得多的压缩率(压缩率是压缩文件与未压缩文件的比值)。

    音频能够在没有察觉的质量下降情况下实现10:1的压缩比,视频能够在稍微观察质量下降的情况下实现如300:1这样非常大的压缩比。

    有损压缩图像的特点是保持颜色的逐渐变化,删除图像中颜色的突然变化。生物学中的大量实验证明,人类大脑会利用与附近最接近的颜色来填补所丢失的颜色。例如,对于蓝色天空背景上的一朵白云,有损压缩的方法就是删除图像中景物边缘的某些颜色部分。当在·屏幕上看这幅图时,大脑会利用在景物上看到的颜色填补所丢失的颜色部分。利用有损压缩技术,某些数据被有意地删除了,而被取消的数据也不再恢复。

    有损静态图像压缩经常如音频那样能够得到原始大小的1/10,但

    有损压缩有损压缩

    是无可否认,利用有损压缩技术是会影响图像质量,尤其是在仔细观察的时候,质量下降更加明显,。另外,如果使用了有损压缩的图像仅在屏幕上显示,可能对图像质量影响不太大,至少对于人类眼睛的识别程度来说区别不大,因为人的眼睛对光线比较敏感,光线对景物的作用比颜色的作用更为重要。可是,如果要把一幅经过有损压缩技术处理的图像用高分辨率打印机打印出来,那么图像质量就会有明显的受损痕迹。

    一些方法将人体解剖方面的特质考虑进去,例如人眼只能看到一定频率的光线。心理声学模型描述的是声音如何能够在不降低声音感知质量的前提下实现最大的压缩。

    常见格式

    ——MP3(MP3PRO\MP3SURROUND)、AAC(*.3gp/*.mp4/*.m4a)、ATRAC3/ATRAC3+(*.aa3)。

    先来明白音频压缩的原理:利用人耳听觉的心理声学特性(频谱掩蔽特

    有损压缩有损压缩

    性和时间掩蔽特性等)以及人耳对信号幅度、频率、时间的有限分辨能力,编码时凡是人耳感觉不到的频率不编码、不传送,即凡是对人耳辨别声音信号的强度、声调、方位没有贡献的部分(称为不相关部分或无关部分)都不编码和传送。对感觉不到的部分进行编码时,允许有较大的量化失真、并使其处于听阈(即人耳所能听到的最低音量)以下,人耳仍然感觉不到。音频的压缩就是利用这些特点来工作的。

    心理声学的几个基本概念

    1、等响度曲线

    人的听觉的灵敏度随着频率而改变。即通常两个功率一样但频率不同的音调听起来并不一样响。通过等响度曲线,我们可以看出,人耳对4KHz的频率最灵敏,即在4KHz下能被察觉出来的声音压力水平(响度),在其他频率下并不能被察觉。这就给在一些不太灵敏的频率下失真提供了条件。

    2、屏蔽

    我们上高中物理时学过屏蔽。就是强的声音信号把弱的声音信号覆盖,导致我们无法察觉。而且,当两个声音在时间和频率上很接近时,屏蔽效应就会很强。因此,我们可以在编码时对被屏蔽的部分不编码、不传送。这样,音质依然没有大的损失,人耳也不易察觉。

    3、临界频带

    对于人类的听觉来说,对声音的感知特性并不是以线形频率为尺度来变化的(人的听觉还没那么好),而是可以用被称为临界频带的一系列有限的频段来表达。简单的说,把整个频带划分成几段,在这每个频段里,人耳的听觉感知是相同的,即心理声学特性都是一样的。

    言归正传,编码的精髓就是算法。

    主流编码及其算法

    1、MP3(MP3PRO\MP3SURROUND)

    MP3应该算目前应用最广泛的有损压缩数字音频格式了。它的全称是MPEG(MovingPictureExpertsGroup)AudioLayer-3。1987年德国Fraunhofer研究院研制成功的一种有损压缩数字音频格式,并于1989年取得专利。起初,它并不完善,它更像一个编码标准框架,留待人们去完善。1992年,这一技术并入了MPEG规范,并有了正式名号——MP3。

    MP3文件是由帧(frame)构成的,帧是MP3文件最小的组成单位。什么是帧?还记得最初的动画是怎么做的吗?不同的连续画面切换以达到动态效果,每幅画面就是一个“帧”,不同的是MP3里面的帧记录的是音频数据而不是图形数据。MP3的帧速度大概是30帧/秒。

    每个帧又由帧头和帧数据组成,帧头记录着该帧的基本信息,包括位率索引和采样率索引(这对理解ABR和VBR编码方式很重要)。帧数据,顾名思义就是记录着主体音频数据。

    上面说的都是MP3编码的基础,但事实上,早期的编码器都非常不完善,压缩算法近于粗暴,音质很不理想。MP3的音质有两次飞跃:人体听觉心理学模型(PerceptualModel)的导入和VBR技术的应用。

    PS:VBR是variablebitrate的缩写,意思是可变比率,就是MP3文件压制的时候声音元素较多,比率较高时,将自动减低压缩比特率,在比特率需求比较低时自动升高比特率,这样做的目的是在保证音质基本不被损害的情况下增加文件在线播放时的速度,和减少在本机播放时所占的系统资源……这是Xing发展的算法,他们将一首歌的复杂部分用高Bitrate编码,简单部分用低Bitrate编码。主意虽然不错,可惜Xing编码器的VBR算法很差,音质与CBR相去甚远。幸运的是,Lame完美地优化了VBR算法,使之成为MP3的最佳编码模式。这是以质量为前提兼顾文件大小的方式,推荐编码模式。

    MP3能生存到今天,它的发展仍未止步。2001年6月14日,法国汤姆森与美国RCA两家公司联合推出了一种新的压缩格式:MP3PRO。MP3PRO是基于MP3技术改良而来,它利用了CodingTechnologies公司开发的编解码增强技术,该术称为SBR(SpectralBandReplication)。当制作MP3PRO文件时,编码器将音频分为两部分。一部分是将音频数据中的低频部分分离出来,通过传统的M

    有损压缩有损压缩

    P3技术编码得出正常的MP3音频流。此举使MP3编码器专注于低频段信号的压缩从而获得更好的质量,而且使原来的MP3播放器也能播放MP3PRO文件。另一部分则是将分离出来的高频信号进行编码并嵌入MP3流中。传统的MP3播放器会将其忽略掉,而新的MP3PRO播放器会将其还原出来并进行组合,得到高质量的全带宽的声音。通过这项技术,使得MP3PRO64Kbps的编码率便可提供128Kbps的MP3相同的质量,且具有相差无几的音质,而体积只有MP3的一半大小。

    PSP就支持MP3PRO,而且支持MP3PRO的格式转换软件也很多,大家可以去网上找找。有兴趣的话可以试试,绝对比mp3强啊。

    Thomson在2004年12月初正式宣布世界上最流行的音乐压缩格式MP3迈进多声道时代。MP3SURROUND是由FraunhoferIIS和Agere联合开发的,使用了binauralCueCoding(BCC)技术心理声学编码,可以在实现多声道环绕的同时保证文件的大小。同时加入的AgereSystems公司则主要负责将多声道MP3格式——MP3SURROUND进行推广。MP3SURROUND技术实现了5.1声道环绕的高品质音频,应用范围相当广泛,可以在网络音乐发布、广播系统、PC视听应用、游戏音效、消费电子产品和车载音响等方面发挥作用。尽管集成了多个声道,但是Thomson表示MP3SURROUND文件相对于普通MP3(采样率相当)并没有太大的增加,相对于其他环绕多声道音频格式就只有它们的一半了。更为重要的,MP3SURROUND提供了良好的兼容性,可以在现有的MP3软件、MP3播放器上正常使用。

    2、AAC(*.3gp/*.mp4/*.m4a)

    AAC是高级音频编码(AdvancedAudioCoding)的缩写,它是由Fraunhofer研究院、杜比和AT&T共同研发的。AAC是MPEG-2规范的一部分,它适用于从速率8Kbps的单声道电话音质到160Kbps多声道的超高质量音频范围内的编码。AAC与MP3相比,增加了诸如对立体声的完美再现、码流效果音扫描、多媒体控制、降噪优化等MP3音频格式所没有的特性,使得在音频压缩后仍能完美地再现CD音质。它还同时支持多达48个音轨、15个低频音轨、更多种采样率和比特率、多种语言的兼容性、更高的解码效率。总之,AAC可以在比MP3文件缩小30%的前提下提供更好的音质。

    现将其中的几个模块作一些说明:

    增益控制(Gaincontrol)

    增益控制模块用在可变采样率配置中,它由多相正交滤波器PQF(polyphasequadraturefilter)、增益检测器(gaindetector)和增益修正器(gainmodifier)组成。这个模块把输入信号分离到4个相等带宽的频带中。在解码器中也有增益控制模块,通过忽略PQF的高子带信号获得低采样率输出信号。

    滤波器组(FilterBank)

    滤波器组是把输入信号从时域变换到频域的转换模块,它是MPEG-2AAC系统的基本模块。这个模块采用了改进离散余弦变换MDCT,它是一种线性正交交迭变换,使用了一种称为时域混迭取消TDAC(timedomainaliasingcancellation)技术。MDCT使用KBD(Kaiser-Besselderived)窗口或者使用正弦(sine)窗口,正向MDCT变换可使用下式表示:

    逆向MDCT变换可使用下式表示:

    其中,

    n=样本号,

    N=变换块长度,

    i=块号,

    以上两个离散余弦变换公式在《离散函数》和《数理方程》中有详细介绍,只为帮助有兴趣的玩家了解,不必深究。

    瞬时噪声定形TNS

    在感知声音编码中,TNS模块是用来控制量化噪声的瞬时形状的一种方法,解决掩蔽阈值和量化噪声的错误匹配问题。这种技术的基本想法是,在时域中的音调声信号在频域中有一个瞬时尖峰,TNS使用这种双重性来扩展已知的预测编码技术,把量化噪声置于实际的信号之下以避免错误匹配。

    联合立体声编码

    联合立体声编码(jointstereocoding)是一种空间编码技术,其目的是为了去掉空间的冗余信息。MPEG-2AAC系统包含两种空间编码技术:M/S编码(Mid/Sideencoding)和声强/耦合(Intensity/Coupling)。M/S编码使用矩阵运算,因此把M/S编码称为矩阵立体声编码(matrixedstereocoding)。M/S编码不传送左右声道信号,而是使用标称化的“和”信号与“差”信号,前者用于中央M(middl

    有损压缩有损压缩

    e)声道,后者用于边S(side)声道,因此M/S编码也叫做“和-差编码(sum-differencecoding)”。声强/耦合编码的名称也很多,有的叫做声强立体声编码(intensitystereocoding),或者叫做声道耦合编码(channelcouplingcoding),它们探索的基本问题是声道间的不相关性(irrelevance)。

    预测(Prediction)

    这是在话音编码系统中普遍使用的一种技术,它主要用来减少平稳(stationary)信号的冗余度。

    量化器(Quantizer)

    使用了非均匀量化器。

    无噪声编码(Noiselesscoding)

    无噪声编码实际上就是霍夫曼编码,它对被量化的谱系数、比例因子和方向信息进行编码。

    PS:我个人比较喜欢AAC,所以写的较为详细,大家也不妨试试,绝对比MP3优秀。大家可以使用iTunes6来转换AAC(*.m4a)。iTunes6AAC的操作很简单,你可以直接把AAC(*.3gp\*.mp4\*.m4a)拷贝到[MUSIC]就能播。

    可以说,aac是目前最好的有损压缩方式。

    最高质量的普较无损看(肉眼)不出区别。

    3、ATRAC3/ATRAC3+(*.aa3)

    早年玩MD的朋友都知道SONY专为MD量身定做的ATRAC音频格式算法,后来又广泛应用于SONY的NetworkWalkman和其他便携音频设备。“ATRAC3plus”代表“自适应转换声音编码3+”,是一套基于心理声学原理的音频压缩技术,从ATRAC3格式发展而来,到2002年这项技术才日趋完美。这一技术是把MD随身听的体积缩小到很小的理论基础。 [1] 

    要分析ATRAC3/ATRAC3+,我们先要谈谈它的大哥——ATRAC算法。当数字音频数据被压缩时,通常都会把一定数量的量化噪音带入信号。为了不让这些信号被人耳感知,通常的做法是,音频编码把信号分解为一组单元,每组单元都对应着特定的时间频率范围。编码器会依据前文提到的心理声学原理来分析,对重要的单元进行高精度编码,对不敏感的单元可以保留一些量化的噪音但不影响人耳的感知质量。解码时,量化频谱会根据比特分配重新建立,然后合成音频信号。

    ATRAC也不例外,但有一些改进。ATRAC还应用了子频带译码和转换译码技术,输入的信号被分配得到不均匀的强调重要低音区的频率分割。另外,ATRAC使用一个可变块长度改变输入的信号,这可以确保在稳定通过时高效的译码,不会在瞬间通过时影响时间的分辨率。具体说,输入的信号在5.5125KHz和11.025KHz被分为3个频带。子频带的分解使用QMF(QuadratureMirrorFilters积分映射过滤器)来完成;这3个频带被MDCT(ModifiedDiscreteCosineTransform变址离散余弦变换——类似于通常的快速傅里叶变换,《高等数学二》和《数理方程》中有相关介绍。)转换成频谱值,MDCT允许块之间有达50%的交迭,使得在维持临界采样时能提高频率解析度。块的长度可以根据信号的种类改变,这就是ATRAC的自适应部分(这一做法主要是为了利用屏蔽掩盖初始量化噪音)。

    当ATRAC算法发展了10年,已经满足不了市场的需求,SONY于2002年8月推出了新的算法——

    ATRAC3/ATRAC3+。其核心算法较ATRAC没有本质的大改变,只是采用了改进的频带分离过滤和MDCT,并使用增益调节、音调成分分离、联合立体声(Joint-Stereo)等技术,使得音频压缩数据的体积进一步缩小。

    4、AAL(ATRACAdvancedLossless)

    AAL是ATRACAdvancedLossless(自适应声学转换高级无损编码)的缩写,是SONY新开发的一个音频压缩格式其特点是无损压缩,不损失一点音频信息,一张CD可以压缩到原来的30%--80%。

    5、Ogg

    Ogg全称应该是OGG Vobis(ogg Vorbis) 是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vobis有一个很出众的特点,就是支持多声道,随着它的流行,以后用随身听来听DTS编码的多声道作品将不会是梦想。

    Vorbis 是这种音频压缩机制的名字,而Ogg则是一个计划的名字,该计划意图设计一个完全开放性的多媒体系统。

    Ogg Vorbis文件的扩展名是.OGG。这种文件的设计格式是非常先进的。创建的OGG文件可以在任何播放器上播放,因此,这种文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。

    较aac而言,低频方面略有优势,高频方面比aac差。

    最高质量的普较无损看(肉眼)不出区别。

    最高质量,即Q10,体积比aac使用faac编码最高质量Q500体积大差不多一倍。

    本文转载于:https://www.jmwww.net/file/it/16150.html 转载必须保留

    展开全文
  • 22,波形音频

    2015-08-05 13:58:04
    常见的不压缩数据的方法被称为“脉冲编码调制”(pluse code modulation,PCM) 脉冲编码调制以固定周期频率对波形进行采样,通常每秒几万次。对于每个样品,需要测量波形的幅值,这样分割的很细的话,得到的很多个...

    人发出的是声波,而计算机是以数字形式工作的,所以计算机有必要提供一种将声音转换为数字,再把数字转换为声音的机制。


    最常见的不压缩数据的方法被称为“脉冲编码调制”(pluse code modulation,PCM)

    脉冲编码调制以固定周期频率对波形进行采样,通常每秒几万次。对于每个样品,需要测量波形的幅值,这样分割的很细的话,得到的很多个点再绘制起来就可以还原原来的波形了。模数转换器(analog-digital conventer,ADC)负责将振幅转换为数字,同样数模转换器(digital-to-analog,DAC)负责将数字转换为电子波形。

    又由于播放出来的声音和之前输入的声音并不完全相同,因为这样产生的波形在高频部分具有尖锐的边缘,出于这个原因,播放的硬件往往在数模转换器之后再连接一个低通滤波器,该滤波器能剔除高频率,产生平滑的波形,在输入端,低通滤波器防止在ADC之前。

    脉冲编码调制有两个参数:采样率(即每秒测量波形幅值的次数)和采样大小(即存储幅值水平的位数),然而也并不是采样率越高,采样大小越大越好,因为那种情况可能超越人类感知的范围了。对于采样大小windows支持8位和16位,分别表示一个字节和两个字节。如果要计算未压缩音频所需空间,只要将声音的长度秒数乘以采样率即可。


    下面是函数生成人体感知的波形数据,然后写入波形音频硬件播放:


    1.先开辟两块波形数据缓存指针(PBYTE)和两块波形数据头部(PWAVEHDR),用于向波形音频输出硬件写入

    2,定义波形音频的格式,指定那个音频格式,声道类型,采样率,采样大小等等

    3,waveOutOpen函数打开波形音频播放硬件,该函数可得到波形音频播放硬件句柄,

    4,将波形数据缓存和波形数据头部联系起来,同时调用waveOutPrepareHeader准备好数据头部,目的是在写入播放硬件时,只要先获得了波形数据,就可以只传数据头部即可

    5.调用函数生成波形音频数据,填充缓存,waveOutWrite传入波形数据头部将数据写入波形音频输出硬件,即可播放。

    6,释放开辟的内存


    sinewave.c

    #include<windows.h>
    #include<math.h>
    #include "resource.h"
    
    #define SAMPLE_RATE		11025
    #define FREQ_MIN		20
    #define FREQ_MAX		5000
    #define FREQ_INIT		440
    #define OUT_BUFFER_SIZE	4096
    #define PI				3.14159
    
    BOOL CALLBACK DlgProc(HWNF,UINT,WPARAM,LPARAM);
    
    TCHAR szAppName[]=TEXT("SineWave");
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
    				   PSTR szCmdLine,int iCmdShow)
    {
    	if(-1==DialogBox(hInstance,szAppName,NULL,DlgProc))           //由单纯的窗口变成了对话框
    	{
    		MessageBox(NULL,TEXT("unknow error occurs"),
    			szAppName,MB_ICONERROR);
    	}
    	return 0;
    }
    
    void FillBuffer(PBYTE pBuffer,int iFreq)
    {
    	static double fAngle;
    	int				i;
    
    	for(i=0;i<OUT_BUFFER_SIZE;i++)
    	{
    		pBuffer[i]=(BYTE)(127+127*sin(fAngle));
    
    		fAngle+=2*PI*iFreq/SAMPLE_RATE;
    
    		if(fAngle>2*PI)
    			fAngle-=2*PI;
    	}
    
    }
    
    
    
    BOOL CALLBACK DlgProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    	static BOOL			bShutOff,bClosing;
    	static HWAVEOUT		hWaveOut;
    	static HWND			hwndScroll;
    	static int          iFreq=FREQ_INIT;
    	static PBYTE		pBuffer1,pBuffer2;
    	static PWAVEHDR		pWaveHdr1,pWaveHdr2;
    	static WAVEFORMATEX waveformat;
    	int					iDummy;
    
    	switch(message)
    	{
    	case WM_INITDIALOG:
    		hwndScroll=GetDlgItem(hwnd,IDC_SCROLL);
    		SetScrollRange(hwndScroll,SB_CTL,FREQ_MIN,FREQ_MAX,FALSE);
    		SetScrollPos(hwndScroll,SB_CTL,FREQ_INIT,TRUE);
    		SetDlgItemInt(hwnd,IDC_TEXT,FREQ_INIT,FALSE);
    
    		return TRUE;
    
    	case WM_HSCROLL:                    //-----------焦点在横行滚动条上的消息
    		switch(LOWORD(wParam))
    		{
    		case SB_LINELEFT:	iFreq-=1;break;
    		case SB_LINERIGHT:	iFreq+=1;break;
    		case SB_PAGELEFT:	iFreq/=2;break;
    		case SB_PAGERIGHT:	iFreq*=2;break;
    
    		case SB_THUMBTRACK:
    			iFreq=HIWORD(wParam);
    			break;
    
    		case SB_TOP:
    			GetScrollRange(hwndScroll,SB_CTL,&iFreq,&iDummy);
    			break;
    		}
    
    		iFreq=max(FREQ_MIN,min(FREQ_MAX,iFreq));
    		SetScrollPos(hwndScroll,SB_CTL,iFreq,TRUE);
    		SetDlgItemInt(hwnd,IDC_TEXT,iFreq,FALSE);
    		return TRUE;
    
    		case WM_COMMAND:                 //此处接收来自对话框各按钮的消息
    			switch(LOWORD(wParam))
    			{
    			case IDC_ONOFF:
    				//if turning on waveform,hwaveout is null
    
    				if(hWaveOut==NULL)
    				{
    					//allocate memory for 2 headers and 2 buffers
    					pWaveHdr1=malloc(sizeof(WAVEHDR));
    					pWaveHdr2=malloc(sizeof(WAVEHDR));
    					pBuffer1=malloc(OUT_BUFFER_SIZE);
    					pBuffer2=malloc(OUT_BUFFER_SIZE);
    
    					if(!pWaveHdr1 || !pWaveHdr2 ||!pBuffer1 ||!pBuffer2)    //保证内存都分配成功
    					{
    						if(!pWaveHdr1)	free(pWaveHdr1);
    						if(!pWaveHdr2)	free(pWaveHdr2);
    						if(!pBuffer1)	free(pBuffer1);
    						if(!pBuffer2)	free(pBuffer2);
    
    						MessageBeep(MB_ICONEXCLAMATION);
    						MessageBox(hwnd,TEXT("ERROR allocating memory"),
    							szAppName,MB_ICONEXCLAMATION |MB_OK);
    
    						return TRUE;
    					}
    
    					//variable to indicate off button pressed
    
    					bShutOff=FALSE;
    
    					 
    					//定义波形音频的格式
    
    					waveformat.wFormatTag=WAVE_FORMAT_PCM;
    					waveformat.nChannels=1;
    					waveformat.nSamplesPerSec=SAMPLE_RATE;
    					waveformat.nAvgBytesPerSec=SAMPLE_RATE;
    					waveformat.nBlockAlign=1;
    					waveformat.wBitsPerSample=8;
    					waveformat.cbSize=0;
    					
    					//open waveform audio for ouput 
    
    					//hWaveOut 用来获取音频输出设备的句柄,
    					//就会产生MM_WOM_OPEN
    
    					if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveformat,
    						(DWORD)hwnd,0,CALLBACK_WINDOW)       //(DWORD)hwnd 定义回调机制,CALL_WINDOW定义回调机制如何被解释
    						!=MMSYSERR_NOERROR)
    					{
    						free(pWaveHdr1);
    						free(pWaveHdr2);
    						free(pBuffer1);
    						free(pBuffer2);
    
    						hWaveOut=NULL;
    						MessageBeep(MB_ICONEXCLAMATION);
    						MessageBox(hwnd,
    							TEXT("error opening waveform audio device"),
    							szAppName,MB_ICONEXCLAMATION |MB_OK);
    						return TRUE;
    					}
    
    					//set up header1 and prepare them 
    					//该结构是为了通过api向波形音频设备写入数据
    
    					pWaveHdr1->lpData=pBuffer1;
    					pWaveHdr1->dwBufferLength=OUT_BUFFER_SIZE;
    					pWaveHdr1->dwBytesRecorded=0;
    					pWaveHdr1->dwUser=0;
    					pWaveHdr1->dwFlags=0;
    					pWaveHdr1->dwLoops=1;
    					pWaveHdr1->lpNext=NULL;
    					pWaveHdr1->reserved=0;
    
    					//准备工作,防止wavehdr和缓冲区从内存被交换到磁盘上去了
    					waveOutPrepareHeader(hWaveOut,pWaveHdr1,sizeof(WAVEHDR));
    
    					pWaveHdr2->lpData=pBuffer2;
    					pWaveHdr2->dwBufferLength=OUT_BUFFER_SIZE;
    					pWaveHdr2->dwBytesRecorded=0;
    					pWaveHdr2->dwUser=0;
    					pWaveHdr2->dwFlags=0;
    					pWaveHdr2->dwLoops=1;
    					pWaveHdr2->lpNext=NULL;
    					pWaveHdr2->reserved=0;
    
    					waveOutPrepareHeader(hWaveOut,pWaveHdr2,sizeof(WAVEHDR));
    				}
    				else
    				{
    					//if turning off waveform ,reset waveform audio
    
    					bShutOff=TRUE;
    					waveOutReset(hWaveOut);
    				}
    				return TRUE;
    			}
    			break;
    
    			//message generated from waveoutopen call
    
    			case MM_WOM_OPEN:
    				SetDlgItemText(hwnd,IDC_ONOFF,TEXT("Turn Off"));
    
    				//send two buffer waveform output device
    				//数据写入到波形输出硬件,真正开始播放声音
    
    				FillBuffer(pBuffer1,iFreq);   //注意pBuffer是指针
    				waveOutWrite(hWaveOut,pWaveHdr1,sizeof(WAVEHDR));
    
    				FillBuffer(pBuffer2,iFreq);
    				waveOutWrite(hWaveOut,pWaveHdr2,sizeof(WAVEHDR));
    				return TRUE;
    
    				//message generated when a buffer is finished
    
    			case MM_WOM_DONE:
    				if(bShutOff)
    				{
    					waveOutClose(hWaveOut);   //又产生MM_WOM_CLOSE
    					return TRUE;
    				}
    
    				//fill and send out a new buffer
    
    				FillBuffer(((PWAVEHDR)lParam)->lpData,iFreq);
    				waveOutWrite(hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));
    				return TRUE;
    
    			case MM_WOM_CLOSE:
    
    				//释放准备
    				waveOutUnprepareHeader(hWaveOut,pWaveHdr1,sizeof(WAVEHDR));
    				waveOutUnprepareHeader(hWaveOut,pWaveHdr2,sizeof(WAVEHDR));
    
    				free(pWaveHdr1);
    				free(pWaveHdr2);
    				free(pBuffer1);
    				free(pBuffer2);
    
    				hWaveOut=NULL;
    				SetDlgItemText(hwnd,IDC_ONOFF,TEXT("Turn On"));
    
    				if(bClosing)
    					EndDialog(hwnd,0);
    				return TRUE;
    
    			case WM_SYSCOMMAND:
    				switch(wParam)
    				{
    				case SC_CLOSE:
    					if(hWaveOut!=NULL)
    					{
    						bShutOff=TRUE;
    						bClosing=TRUE;
    
    						waveOutReset(hWaveOut);
    					}
    					else
    						EndDialog(hwnd,0);
    				}
    				break;
    	}
    	return FALSE;
    }

    resource.h

    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by SineWave.rc
    //
    #define IDC_STATIC			-1
    #define IDC_SCROLL                      1000
    #define IDC_TEXT			1001
    #define IDC_ONOFF                       1002
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        102
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1003
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    新建一个resource.rc


    展开全文
  • aac是什么格式呢?...像我们常见的苹果ipod也支持AAC格式的音频文件播放,那么什么方法是可以把aac转换成mp3格式呢?最简单的方法就是利用音频转换器来转换格式了,详细过程请大家参考以下步骤。 方法步骤...

    aac是什么格式呢?aac格式是一种专为声音数据设计的文件压缩格式,与Mp3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,更加小巧。像我们常见的苹果ipod也支持AAC格式的音频文件播放,那么有什么方法是可以把aac转换成mp3格式呢?最简单的方法就是利用音频转换器来转换格式了,详细过程请大家参考以下步骤。

    方法步骤:

    1、要转换音乐格式,首先要在音乐播放器下载AAC音乐。

    2、运行迅捷音频转换器,点击“添加文件”按钮,把要转换的aac音乐格式添加进去。

    3、在“输出格式”上,选择要转换的音频格式“MP3”,同时,还需选择一个合适的声道、质量或者编码;

    4、这里还可以自定义文件保存的位置,比如小编就喜欢保存在桌面这样方便查看。

    5、最后点击右下角的“开始转换”按钮。等待转换完成之后,点击后面的“打开”,然后就可以轻松完成aac转mp3格式文件啦。

    常见音乐格式aac转mp3的简单教程就是这样完成啦。如果你喜欢这款格式转换器,可以下载使用哦,除了支持音频格式互相转换之外,还可以音频合并、音频剪切、提取等。

    展开全文
  • 制作H5作品,视频是很常见的素材,但如果处理不当,视频会出现没法播放或只有声音没有画面等问题,下面我来给出几个相对推荐的处理方法。首先视频的格式需要是MP4,音频编码是AAC,常见的压缩视频软件都会这样的...
    4b0bd2b2896982f0744a0f4fd9035fb9.png

    制作H5作品,视频是很常见的素材,但如果处理不当,视频会出现没法播放或只有声音没有画面等问题,下面我来给出几个相对推荐的处理方法。

    首先视频的格式需要是MP4,音频编码是AAC,常见的压缩视频软件都会有这样的输出视频设置。以格式工厂为例,大概是在下面的几个地方确认一下参数。

    d22921f09bfaf2390f9f63587e1e215f.png

    一般情况下,使用上边的设置就能满足要求,但有时压缩好的视频太大,会超过平台的上传限制。以木疙瘩为例子,会有小于40M的要求。

    8113683ce14349efab4e3316ff0e637c.png

    这个时候就需要考虑把视频的码率调小一些了,视频尺寸也可以选择更适合手机观看的尺寸。如果不确定导出的视频效果,可以尝试多输出几个合格的、不同尺寸和码率的视频,全都放到作品里,最后在手机上测试观看效果,选一个视频清晰度和大小最优的版本。视频能看清的情况下越小越好,视频小一点,H5的加载速度会快很多。

    上边强调需要在手机上测试,因为手机的效果跟电脑上不太一样,最终H5也是在手机上展示给用户看,手机屏幕相对小,有的视频在电脑上看模糊的不行,但在手机上却是相对合适的。

    661198c2d6aa750b31a6ac8edfba2048.png

    当视频的所有参数都正常,电脑上看也正常,但手机上看视频就是不正常呢?你也许应该考虑更新一下压制视频软件的版本,或者换其他的压制视频软件。

    bbddec9dec22df5c86c3de23d457287e.png

    今天的话题就到这里,下次我们来聊一下,视频的自动播放怎么做?

    展开全文
  •  混合编码:综合前面两种方法的编码方法。 语音、语言和音乐合成 语音合成从合成采用技术来讲可分为:  发音参数合成  声道模型参数合成  波形编辑合成 如果从合成策略上又可分为:  频谱逼近  波形...
  • 但是仅 2.53.35.130、2.54.37.135 版转换RM、RMVB文件可以正常转换声音,其余版本有时也可以正常转换,有时直接用RM、RMVB文件做音频输入源时转换后MPG文件图像无声音!  软件解压即可使用,无需安装。  ...
  • 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 个人多媒体计算机 ...
  • 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 399 ∷相关函数:labs函数 2.1.2 求...
  • Boost.Program_options:通过常见的方法,例如命令行和配置文件,来获取程序选择项的库。 Clara:用于C++11及更高版本的易于使用、可组合的命令行解析器。 cli:用于交互式命令行界面的跨平台的C++14库,只有...
  • 学习与掌握geohash编码方法。 Task02:数据分析(2天) 学习如何对AIS数据集整体概况进行分析,掌握船舶轨迹数据集基本情况(缺失值、异常值) 学习了解数据变量之间相互关系、变量与预测值之间存在关系。...
  • JAVA的声音处理方法 Java的网络功能与编程 一 JAVA的网络功能与编程 二 JAVA动态效果(1)表格时钟 java跟microsoft转 Java混淆编译器 Java入门理解构造器 Java性能的优化(上) Java性能的优化(下) ...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    本项目从Android的声音处理入手,实现音乐功能,根据用户的兴趣,提高用户参与度。 问:什么应用价值? 答: 本项目是一个能提高用户参与和娱乐程序的项目,具有一定的使用价值。 追求的结果--钢琴练奏师 1.2 ...
  • 面试题5:如何以最简单方式让电脑蜂鸣器发出声音 3.2 编程规范 面试题6:谈谈你对编程规范理解或认识 面试题7:函数、变量等命名都哪些规则 面试题8:写出bool、int、float、指针变量与“零值”比较if语句 ...
  • 会计理论考试题

    2012-03-07 21:04:40
    8.常见的形码汉字输入技术表形码和五笔字型码。( N ) 9.汉字语音识别输入技术属于音形码汉字输入技术。( N ) 10.计算机的常用输出设备打印机和显示器。(Y ) 11.微机中内存储器指的就是只读存储器(ROM)。...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    常见的有HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK MCU系列、Microchip MCU系列及8051等。 嵌入式DSP专门用来处理对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在...
  • 常见的有:WINDOWS、LINUX、UNIX等。 应用软件:OFFICE、PHOTOSHOP 等 9、冯。诺依曼:美籍匈牙利科学家。被称为计算机之父。他提出的“存储程序”工作原理: 10、 11、从功能来讲,每台计算机都控制...
  • 开启计算机或重新启动计算机后,听见自检通过的声音后,按 “Del”键就可以进入CMOS的设置界面;要注意的是,如果按得太晚,计算机将会启动系统,这时只有重新启动计算机了。大家可在开机后立刻按DEL键直到进入CMOS...
  • 三、天馈线常见的故障处理 103 3.1 天馈线安装问题 103 3.2 天馈线进水问题 104 3.3 天线高度的调整 104 3.4 天线俯仰角的调整 104 3.5 天线方位角的调整 104 第四部分:CDMA无线网络优化 105 一、无线网络优化...
  • 2.8 其他常见的Visual Studio操作 29 2.8.1 创建新项目 29 2.8.2 引用其他对象 30 2.8.3 使用智能标记 32 2.8.4 保存和导入Visual Studio设置 32 2.8.5 验证HTML 34 2.8.6 团队的合作 36 2.8.7 使用代码片断 ...
  • 6.2 常见算法实际应用 实例136 计算1+22+33+44+…+nn值 实例137 计算10!值 实例138 求最大公约数 实例139 求最小公倍数 实例140 判断素数算法 实例141 按要求生成指定位数编号 实例142 身份证号从...
  • 6.2 常见算法实际应用 实例136 计算1+22+33+44+…+nn值 实例137 计算10!值 实例138 求最大公约数 实例139 求最小公倍数 实例140 判断素数算法 实例141 按要求生成指定位数编号 实例142 身份证号从...
  • 6.2 常见算法实际应用 实例136 计算1+22+33+44+…+nn值 实例137 计算10!值 实例138 求最大公约数 实例139 求最小公倍数 实例140 判断素数算法 实例141 按要求生成指定位数编号 实例142 身份证号从...
  • AIF,AIFF:音频互交换文件,Silicon Graphic and Macintosh应用程序的声音格式 ANI:Windows系统中的动画光标 ARC:LH ARC的压缩档案文件 ARJ:Robert Jung ARJ压缩包文件 ASD:Microsoft Word的自动保存文件;...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
    状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前计数器初始化,调用每一个EJB对象count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
  • 主要内容C#开发环境使用、C#语言基础应用、字符串处理技术、数组和集合使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows常用控件使用、...
  • 6.2 常见算法实际应用 180 实例136 计算1+22+33+44+…+nn值 180 实例137 计算10!值 181 实例138 求最大公约数 181 实例139 求最小公倍数 182 实例140 判断素数算法 183 实例141 按要求生成指定位数编号 ...
  • 最后就是项目了,实际就是在工作中应用,这个我也说不好,每个人都自己的方法吧。当然,深入看源码是躲不过,分享一个如何阅读Flink源码回答,我自以为是很大帮助 大数据开发环境安装配置 以下出自我在...
  • CuteFTP9简易汉化版

    2014-04-11 12:31:30
    SSL会话Choices-When设置SSL连接,一种上传软件允许您选择三种常见的SSL实现,包括TLS(AUTH TLS)*,SSL隐* *(直接连接在端口990)和SSL显式* *(身份验证SSL)模式。大多数FTP服务器支持至少一种,而一些(比如Globalscape ...

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

常见的声音编码方法有