这段代码限制很大,只能采样率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