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 );
}
}
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 );
}
}