分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
=====================================================
视音频数据处理入门系列文章:
=====================================================
上一篇文章记录了RGB/YUV视频像素数据的处理方法,本文继续上一篇文章的内容,记录PCM音频采样数据的处理方法。音频采样数据在视频播放器的解码流程中的位置如下图所示。
分离PCM16LE双声道音频采样数据的左声道和右声道
将PCM16LE双声道音频采样数据中左声道的音量降一半
将PCM16LE双声道音频采样数据的声音速度提高一倍
将PCM16LE双声道音频采样数据转换为PCM8音频采样数据
从PCM16LE单声道音频采样数据中截取一部分数据
将PCM16LE双声道音频采样数据转换为WAVE格式音频数据
注:PCM音频数据可以使用音频编辑软件导入查看。例如收费的专业音频编辑软件Adobe Audition,或者免费开源的音频编辑软件Audacity。
函数列表
(1)分离PCM16LE双声道音频采样数据的左声道和右声道
本程序中的函数可以将PCM16LE双声道数据中左声道和右声道的数据分离成两个文件。函数的代码如下所示。/** * Split Left and Right channel of 16LE PCM file. * @param url Location of PCM file. * */int simplest_pcm16le_split(char *url){ FILE *fp=fopen(url,"rb+"); FILE *fp1=fopen("output_l.pcm","wb+"); FILE *fp2=fopen("output_r.pcm","wb+"); unsigned char *sample=(unsigned char *)malloc(4); while(!feof(fp)){ fread(sample,1,4,fp); //L fwrite(sample,1,2,fp1); //R fwrite(sample+2,1,2,fp2); } free(sample); fclose(fp); fclose(fp1); fclose(fp2); return 0;}
调用上面函数的方法如下所示。
simplest_pcm16le_split("NocturneNo2inEflat_44.1k_s16le.pcm");
从代码可以看出,PCM16LE双声道数据中左声道和右声道的采样值是间隔存储的。每个采样值占用2Byte空间。代码运行后,会把NocturneNo2inEflat_44.1k_s16le.pcm的PCM16LE格式的数据分离为两个单声道数据:
output_l.pcm:左声道数据。注:本文中声音样值的采样频率一律是44100Hz,采样格式一律为16LE。“16”代表采样位数是16bit。由于1Byte=8bit,所以一个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中。output_r.pcm:右声道数据。
下图为输入的双声道PCM数据的波形图。上面的波形图是左声道的图形,下面的波形图是右声道的波形。图中的横坐标是时间,总长度为22秒;纵坐标是取样值,取值范围从-32768到32767。
下图为分离后左声道数据output_l.pcm的音频波形图。
下图为分离后右声道数据output_r.pcm的音频波形图。
(2)将PCM16LE双声道音频采样数据中左声道的音量降一半
本程序中的函数可以将PCM16LE双声道数据中左声道的音量降低一半。函数的代码如下所示。/** * Halve volume of Left channel of 16LE PCM file * @param url Location of PCM file. */int simplest_pcm16le_halfvolumeleft