音频采样率转换问题

sunghj sunghj 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在程序里用acm进行音频转换,例如22050-》44100,44100-》22050
代码如下:

LPWAVEFORMATEX sourceFormat = (LPWAVEFORMATEX) new char [maxSize];
LPWAVEFORMATEX destFormat = (LPWAVEFORMATEX) new char [maxSize];
memset(sourceFormat, 0, maxSize);
memset(destFormat, 0, maxSize);
sourceFormat->wFormatTag = WAVE_FORMAT_PCM;
sourceFormat->nChannels = 2;
sourceFormat->nSamplesPerSec = 22050;
sourceFormat->wBitsPerSample = 16;
sourceFormat->cbSize = 0;
sourceFormat->nBlockAlign = 4;
sourceFormat->nAvgBytesPerSec = 22050* 4;

destFormat->wFormatTag = WAVE_FORMAT_PCM;
destFormat->nChannels = 2;
destFormat->nSamplesPerSec = 44100;
destFormat->wBitsPerSample = 16;
destFormat->cbSize = 0;
destFormat->nBlockAlign = 4;
destFormat->nAvgBytesPerSec = 44100* 4;
HACMSTREAM hstr1;
mmr = acmStreamOpen(&hstr1,
NULL, // driver handle
sourceFormat, // source format
m_destFormat, // destination format
NULL, // no filter
NULL, // no callback
0, // instance data (not used)
ACM_STREAMOPENF_NONREALTIME);
DWORD suggestedDestSize;
suggestedDestSize = 0;
hr = acmStreamSize(hstr1, numFramesAvailable*pwfx->nBlockAlign, &suggestedDestSize, ACM_STREAMSIZEF_DESTINATION);

BYTE* pDstData = new BYTE [dwDstBytes];
ACMSTREAMHEADER shdr;
memset(&shdr, 0, sizeof(shdr));
shdr.cbStruct = sizeof(shdr);
shdr.pbSrc = pData; //
shdr.cbSrcLength = numFramesAvailable*pwfx->nBlockAlign;
shdr.pbDst = pDstData; //
shdr.cbDstLength = suggestedDestSize;

mmr = acmStreamPrepareHeader(hstr1, &shdr, 0);
mmr = acmStreamConvert(hstr1, &shdr, 0);

......

mmr = acmStreamUnprepareHeader(hstr1, &shdr, 0);

.....
现在的问题是从44100-》22050正常,但是从22050-》44100严重失真
...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
sunghj
VC/MFC 16,550 成员 421,606 内容