音频重采样(8k到16k)

基本抄的这里

这段代码限制很大,只能采样率8k的16bit的音频变成采样率16k的16bit的声音

/**
 * 采样率改变.
 * (原理就是将值简单的复制一下)
 * \param pInAudioData 输入的音频数据(注意这里是short)
 * \param nInAudioLen 输入数据的长度
 * \param pOutAudioData 输出的音频数据
 * \param nOutAudioLen 输出的音频数据长度
 */
void Resample16K(short* pInAudioData, int nInAudioLen, short* pOutAudioData, int& nOutAudioLen)
{
	short* sSampleIn = pInAudioData;
	int nFrequency = 0;
	while (sSampleIn - pInAudioData < nInAudioLen)
	{
		memcpy((char*)(pOutAudioData + nFrequency), (char*)sSampleIn, 2);
		nFrequency++;
		memcpy((char*)(pOutAudioData + nFrequency), (char*)sSampleIn, 2);
		nFrequency++;
		sSampleIn++;
	}

	nOutAudioLen = nFrequency * 2;
}

int main()
{
	//pcm_rate_trans(16, "./robin_ori_8_1_16.pcm", 8000, "./robin_ori_16_1_16.pcm", 16000);


	char filename[] = "./robin_ori_8_1_16.pcm";
	FILE* fp = NULL;
	fopen_s(&fp,filename, "ab+");
	FILE* fp_down = NULL;
	fopen_s(&fp_down,"./robin_ori_16_1_16.pcm", "wb+");

	fseek(fp, 0, SEEK_END);
	int buff_len = ftell(fp);
	fseek(fp, 0, SEEK_SET);

	unsigned char* pData = (unsigned char*)malloc(buff_len);
	memset(pData, 0, buff_len);
	fread(pData, sizeof(unsigned char), buff_len, fp);

	char* pOutData = new char[buff_len * 2];
	memset(pOutData, 0, buff_len * 2);
	int nLOutLen = 0;
	Resample16K((short*)pData, buff_len / 2, (short*)pOutData, nLOutLen);


	fwrite(pOutData, 1, nLOutLen, fp_down);

	fclose(fp);
	fclose(fp_down);


    std::cout << "Hello World!\n";
}

类似ffmepg直接转的命令
pcm转pcm

./ffmpeg -ar 8000 -ac 1 -f s16le -i robin_app.pcm -ar 16000 -ac 1 -f s16le robin_16k_1_16.pcm

不过ffmpeg的转换命令功能要强大的多。

wav转pcm

 ./ffmpeg -ar 16000 -ac 1 -f s16le -i test.wav  -ar 16000 -ac 1 -f s16le  beijing_16_16.pcm
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值