采样率转换

这篇博客介绍了如何在Windows环境下使用ACM音频库进行采样率转换。通过包含`msacm.h`头文件,并实现`PrepareConvert`、`UnPrepareConvert`和`ConvertAndSend`函数,实现了音频数据的转换并发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1.可以用傅立业变换。  
  2.使用windows的acm音频库,下面是我程序中的一段代码,我用的没有问题。你可以参考一下。  
  #include   "msacm.h"  
  ACMSTREAMHEADER   m_acmHeader;  
  HACMSTREAM   m_acmHas;  
  MMRESULT   PrepareConvert(DWORD   dwSrcSize)  
  {  
  //__asm   int   3;  
  MMRESULT   mmr   =   acmStreamOpen(&m_acmHas,   NULL,   &m_SourceWfx,   &m_destWfx,    
                                                    NULL,   NULL,   0,   ACM_STREAMOPENF_NONREALTIME   );  
  if(   mmr   !=   0   ){  
  debug("failed   to   prepare,   acmStreamOpen");  
  return   mmr;  
  }  
   
  DWORD   dwDestSize   =   0;  
  mmr   =   acmStreamSize(m_acmHas,   dwSrcSize,   &dwDestSize,ACM_STREAMSIZEF_SOURCE   );  
  if(   mmr   !=   0   ){  
  debug("failed   to   prepare,   acmStreamSize");  
  return   mmr;  
  }  
   
  m_acmHeader.cbStruct =   sizeof(m_acmHeader);  
  m_acmHeader.fdwStatus =   0;  
  m_acmHeader.dwUser =   0;  
  m_acmHeader.pbSrc =   new   unsigned   char[dwSrcSize];  
  m_acmHeader.cbSrcLength =   dwSrcSize;  
  m_acmHeader.cbSrcLengthUsed =   0;  
  m_acmHeader.dwSrcUser =   0;  
  m_acmHeader.pbDst =   new   unsigned   char[dwDestSize];  
  // char   *szBuff   =   new   char[200];  
  m_acmHeader.cbDstLength =   dwDestSize;  
  m_acmHeader.cbDstLengthUsed =   0;  
  m_acmHeader.dwDstUser =   0;  
  mmr   =   acmStreamPrepareHeader(m_acmHas,   &m_acmHeader,   0);  
  if(   mmr   !=   0   ){  
  debug("failed   to   prepare,   acmStreamPrepareHeader");  
  return   mmr;  
  }  
   
  m_bPrepared   =   TRUE;  
   
  return   0;  
  }  
  MMRESULT   UnPrepareConvert()  
  {  
  if(   !m_bPrepared   ){  
  return   0;  
  }  
   
  MMRESULT   mmr   =   acmStreamUnprepareHeader(m_acmHas,   &m_acmHeader,   0);  
  if(   m_acmHeader.pbSrc   !=   NULL   ){  
  delete   []   m_acmHeader.pbSrc;  
  }  
  if(   m_acmHeader.pbDst   !=   NULL   ){  
  delete   []   m_acmHeader.pbDst;  
  }  
   
  if(   m_pbBuffer   !=   NULL   ){  
  delete   []   m_pbBuffer;  
  }  
   
  mmr   =   acmStreamClose(m_acmHas,   0);  
   
  m_bPrepared   =   FALSE;  
   
  return   0;  
  }  
   
  void   ConvertAndSend(const   char   *pBuf,   DWORD   dwLen)  
  {  
  m_acmHeader.cbSrcLength =   dwLen;  
  m_acmHeader.cbDstLengthUsed =   0;  
  memcpy(m_acmHeader.pbSrc,   pBuf,   dwLen);  
   
  MMRESULT   mmr   =   acmStreamConvert(m_acmHas,   &m_acmHeader,   ACM_STREAMCONVERTF_BLOCKALIGN);  
  if(   mmr   ==   0   ){  
  //   ·¢ËÍ  
  SendData(   m_acmHeader.pbDst,   m_acmHeader.cbDstLengthUsed   );  
  }  
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值