C++ 调节PCM音频音量大小

    在用解码器解码音频数据得到PCM音频数据块之后,可以在将数据送给声卡播放之前调节其音量大小,PCM格式本身就是以一定的数据位记录音量的高低(如16位,便是以2个byte的长度记录采样时间点音量的大小),因此音频音量大小的调节原理就是调节这个值而已,非常的简单。需要注意的就是越界问题,在调节完后要做处理。

    具体的实现函数如下:

void RaiseVolume(char* buf, UINT32 size, UINT32 uRepeat, double vol)//buf为需要调节音量的音频数据块首地址指针,size为长度,uRepeat为重复次数,通常设为1,vol为增益倍数,可以小于1
{
	if (!size)
	{
		return;
	}
	for (int i = 0; i < size; i += 2)
	{
		short wData;
		wData = MAKEWORD(buf[i], buf[i + 1]);
		long dwData = wData;
		for (int j = 0; j < uRepeat; j++)
		{
			dwData = dwData * vol;
			if (dwData < -0x8000)
			{
				dwData = -0x8000;
			}
			else if (dwData > 0x7FFF)
			{
				dwData = 0x7FFF;
			}
		}
		wData = LOWORD(dwData);
		buf[i] = LOBYTE(wData);
		buf[i + 1] = HIBYTE(wData);
	}
}

    另外,有了上面的知识,也可以很容易判断音频中是否有长时间没有声音的情况,以便后面做语言识别的时候可以直接截取有声音的部分做识别。

#include <stdio.h>
#include <Windows.h>

FILE*			ipcmfile;  //音频文件
FILE*			opcmfile;  //音频文件
char data[2];
void main()
{
	fopen_s(&ipcmfile, "录音测试.pcm", "rb");
	fopen_s(&opcmfile, "录音测试转换.pcm", "wb");
	while (fread(data, 1, 2, ipcmfile) == 2)
	{
		short wData;
		wData = MAKEWORD(data[0], data[1]);
		long dwData = wData;

		if (abs(dwData)>50)
		{
			fwrite(&data[0], 1, 2, opcmfile);
		}
	}
	fclose(ipcmfile);
	fclose(opcmfile);
}




  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值