您的位置:首页 > 其它

MP3、WAV音频处理小结

2012-11-23 11:56 190 查看
摘自:原创

作者:


1.如何将MP3转为WAV

使用的Mp3play.ocx。

这个OCX组件使用非常简单,但在Delphi下使用时需要注意:它的可见性不能设为False,否则将无法使用(真TM怪),但在VB6下无些问题。

2.如何将WAV转为MP3

使用lame.exe 或lame_enc.dll,我使用lame.exe。

3.对音频进行处理的大过程

将MP3解为WAV ==>> 对WAV数据进行操作、处理 ==>> 将WAV数据压缩为MP3

4.如何绘制音频波型图

我使用TeeChart中的FastLine(FastLine是否真的比Line快呢?),不过要注意:FastLine最多支持的点数为:28,000,000个点,多了会报:out of Memory错。

另外,使用FastLine绘制20万左右个点的速度还是能接受的,太多了绘制、显示、刷新的速度会很慢。(我的PC:I32100,4G内存)

注:20万个点对于音频数据来说太小意思。

5.绘制波型图时如何加快绘制速度

对WAV数据进行再次采样,减少采样率,以达到减少绘制点数的目的。

6.在什么样的采样率下绘制波型图效果比较理想(即好看,速度又快)

个人感觉:把44100Hz的采样率降到441Hz时效果还是很不错的,再降低些也没关系,但太低了就不好了。如下图所示:一个2500万个采样的音频文件降到160万个采样时基本上与原图没什么差别,但如果降到1万以内时就走了样了。



7.如何降低采样率

简单的说:就是隔n个取一个值,这样就把采样率降到了n分之一,而且不影响波型的视觉效果。
以前我增采用过两个相邻值相加再除以2的算法来计算降低一倍采样率后的数据,然后反复执行这个过程以达到降低2的n次方倍采样率的目的,一开始感觉这种方式挺好,你想呀音波本来就是连续的,相邻的两个值相加除以2不是可以很好的保持这种连续关系吗?但后来与隔n个取一个值的方式一比(画出的波型图)才发现居然直接取值的效果会更好,而相加除以2的算法在降低同样采样率的情况下绘出的波型图走样很多,主要表现为:采样值被向0值压缩了,以致于波型没有了!为什么会这样呢?因为:取两个值的中间值实际上就是把高的值给削小了,低值被增高了,这样重复几遍后高的值会被不断的削小,低值不断的被增高,最后以致于没有的差值,也就没有了波形。

8.如何统一8位、16位、24位和32位采样精度的波型图

精度不一样,则采样值的大小就差好多,如果按实际值画图,会出现很大的值,波型图会很难看,所以应当把各种精度的值统一到一个精度上来,比如:8位,这样就要求对高精度数据进行降精度操作
如何降低精度呢?直接除以相应值就可以了,比如:16位的除以0x100,24位的除以0x10000,32位的除以0x1000000,使用这样得到的值绘制的波形图与原值的波形图在视觉上没有太大的差别

9.关于8位、16位、24位和32位采样精度的音频数据

8位数据是无符号的整型数,如果不加处理绘制出来的图形是以0x80为中心上下波动的波形
16位、24位和32位数据都是有符号的整形数,这样的数据绘制的图形是以0值为中心上下波动的波形

10.关于8位、16位、24位和32位音频数据的读取和处理

为使得绘制出来的波形图好看一些,需要对音频数据进行处理
(以下所使用的变量类型的操作方法均以Delphi为基础)
读取8位音频时,可以定义一个Smallint 的变量:A8,然后使用Move(Wav
,A8,1)方式直接向这个变量中读入一个字节就可以,读出后再将A8减去0x80,这样取到的值就是以0x0为中心上下波动的了
读取16位音频时,可以定义一个Smallint 的变量:A16,然后使用Move(Wav
,A16,2)方式直接向这个变量中读入两个字节就可以,这个值直接就是有符号的整数的
读取24位音频时,可以定义一个Integer 的变量:A24,然后使用Move(Wav
,A24,3)方式直接向这个变量中读入三个字节,由于Integer是四字节的数据类型,所以读入三个字节后最高位的字节是0,而且这时的A24不是一个有符号的整数,而是一个正整数,为了得到一个有符号的数可进行如下操作:先将A24左移8位得到一个有符号的32位整数,再将A24除以0x100就可以了
读取32位音频时,可以定义一个Integer 的变量:A32,然后使用Move(Wav
,A32,4)方式直接向这个变量中读入四个字节

11.如何判断音频数据中的静音位置(我这次做这个音频处理的最终目的是要根据音频中的静音来把大的MP3分割成小的MP3)

音频的静音就是一段时间内没有波形变化,表现在数据上就是一段时间内音频数据没有大幅度的变化,于是就可以通过统计一段时间内数据的变化量(率)来得到静音位置
我是以一个采样点为基础,统计后面连续的采样点的数值变化范围是否在一定范围内,如果在一定的范围内则认为音频没有变化,否则认为变化了,然后再以发生变化的采样点为基础继续统计后面的数据,这样就可以得到一个表:音频值Y连续在X个采样中没有变量,而X值可通过采样率等换算成时间,音频在n秒内没变化的位置基本上可以认定为是静音了。当然这样找到的位置也可能不是静音,而是一个长时间输出的高音。

12.如何处理4位采样精度的数据

没来得及拿这样的数据进行测试,估计与8位精度数据的处理方法一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: