PCM音频采样数据处理(该阶段是处于音频解码——— >播放阶段)
基本概念:
pcm编码格式的概念:pcm编码的概念 ,pcm是音频编码的一种,想wav就是用没有压缩过的pcm编码+头信息来封装的。
本文的PCM音频格式是PCM16LE,其中16的含义,每个声音采样点用16bit表示,那么16位的范围为-32758~~32757(0~65535),8位PCM 编码每个声音采样点用8bit来表示,所以16位PCM编码的采样精度更高,所以音质好一些,但8位PCM 编码所使用的数据量小一半,所以更容易存储和传输。LE是采用的格式,表示小端存储(Little Endian),代表2Byte采样值的存储方式为高位存在高地址中。
8位PCM编码常用于电话等通讯电路,采样速率8k,节省传输带宽。16位PCM 编码常用于电脑多媒体声音文件,采样速率44.1K,音质好。为了提高信噪比,8位PCM编码动态压缩技术,也就是说非线性量化,对小信号采样级数更多,压缩方法有A率和u率两种,中国和欧洲用A率,美国用U率。8位PCM 编码播放的时候也要解压缩成16位pcm播放。
le:本文中声音样值的采样频率一律是44100Hz,采样格式一律为16LE。“16”代表采样位数是16bit。由于1Byte=8bit,所以一个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中。
音视频编解码格式汇总: 点击打开链接
实际操作
分离PCM16LE双声道音频采样数据的左声道和右声道
//split litisheng pcm to left and right
int main(void)
{
FILE *fp = fopen("/home/huangyu/HYtestyinshipin/pcm/NocturneNo2inEflat_44.1k_s16le.pcm","rb+");
FILE *fp_left = fopen ("/home/huangyu/HYtestyinshipin/pcm/NocturneNo2inEflat_left.pcm","wb+");
FILE *fp_right = fopen ("/home/huangyu/HYtestyinshipin/pcm/NocturneNo2inEflat_right.pcm","wb+");
//这里为什么申请4个byte的空间,因为这个pcm是双声道的,一个声道一个采样点有16bit 2Byte,这是双声道的资料,所以申请四个Byte
unsigned char *sample=(unsigned char *)malloc(4);
int a = 0;
while(!feof(fp)){
a++;
fread(sample,1,4,fp);
//L 写入到左声道文件
fwrite(sample,1,2,fp_left);
//R 写入到右声道文件
fwrite(sample+2,1,2,fp_right);
}
int c = feof(fp);
printf("c = %d , a = %d" , c ,a);//1 970202 一共执行了970202次 /44100hz = 22s左右,说明每秒有44100个采样点,每个声道
free(sample);
fclose (fp);
fclose (fp_left);
fclose (fp_right);
return 0;
}
//split litisheng pcm to left and right
int main(void)
{
FILE *fp = fopen("/home/huangyu/HYtestyinshipin/pcm/NocturneNo2inEflat_44.1k_s16le.pcm","rb+");
FILE *fp_left = fopen ("/home/huangyu/HYtestyinshipin/pcm/NocturneNo2inEflat_left.pcm","wb+");
FILE *fp_right = fopen ("/home/huangyu/HYtestyinshipin/pcm/NocturneNo2inEflat_right.pcm","wb+");
//这里为什么申请4个byte的空间,因为这个pcm是双声道的,一个声道一个采样点有16bit 2Byte,这是双声道的资料,所以申请四个Byte
unsigned char *sample=(unsigned char *)malloc(4);
int a = 0;
while(!feof(fp)){
a++;
fread(sample,1,4,fp);
//L 写入到左声道文件
fwrite(sample,1,2,fp_left);
//R 写入到右声道文件
fwrite(sample+2,1,2,fp_right);
}
int c = feof(fp);
printf("c = %d , a = %d" , c ,a);//1 970202 一共执行了970202次 /44100hz = 22s左右,说明每秒有44100个采样点,每个声道
free(sample);
fclose (fp);
fclose (fp_left);
fclose (fp_right);
return 0;
}