怎么将语音通信中双方(甚至多人)的语音保存在一个文件中?
在做一个语音通信程序,现在在保存语音纪录是遇到问题:如何将双方或者多人的语音数据混合起来保存到一个文件中。我使用下边的这个类可以保存单个人的(自己的,或者对方的),没有压缩,直接保存成wav文件,可以用播放器播放。但如果定义一个全局变量比如 CPCMWriter m_wavWiter,在通信过程中同时调用m_wavWriter.UpdateAudio(char *pBuf, int nSize);保存的话,后来得到的wav文件播放长度就是实际的2倍,而且听起来惨不忍听,拖拖拉拉还发颤,非常恐怖,感觉可能需要什么混音技术吧,不太懂,望达人指教!多谢了!!
以下是这个类,很简单。
#include <mmsystem.h>
class CPCMWriter
{
public:
/* CPCMWriter();
virtual ~CPCMWriter();
int Init(CHAR *szFileName, WAVEFORMATEX *pfx);
void Cleanup();
int UpdateAudio(char *pBuf, int nSize); */
CPCMWriter()
: m_fInited(FALSE), m_fp(NULL)
{
m_dwTotalSize = m_dwAudioSize = 0;
}
~CPCMWriter()
{
if (m_fInited)
{
Cleanup();
}
}
int Init(CHAR *szFileName, WAVEFORMATEX *pfx)
{
if (m_fInited)
return -1;
m_fp = fopen(szFileName, "wb");
if (m_fp == NULL)
return -1;
m_fInited=TRUE;
m_dwTotalSize = 44;
m_dwAudioSize = 0;
// write wave file header
fwrite("RIFF", 1, sizeof(DWORD), m_fp);
DWORD dwSize = 44;
fwrite(&dwSize, 1, sizeof(DWORD), m_fp);
fwrite("WAVE", 1, sizeof(DWORD), m_fp);
fwrite("fmt ", 1, sizeof(DWORD), m_fp);
dwSize = sizeof(PCMWAVEFORMAT);
fwrite(&dwSize, 1, sizeof(DWORD), m_fp);
fwrite(pfx, 1, dwSize, m_fp);
fwrite("data", 1, sizeof(DWORD), m_fp);
dwSize = 0;
fwrite(&dwSize, 1, sizeof(DWORD), m_fp);
return 0;
}
int UpdateAudio(char *pBuf, int nSize)
{
_ASSERT(pBuf);
if (nSize == 0)
return -1;
if (m_fp == NULL)
return -1;
fwrite(pBuf, 1, nSize, m_fp);
m_dwTotalSize += nSize;
m_dwAudioSize += nSize;
return 0;
}
private:
void Cleanup()
{
if (m_fInited)
{
fseek(m_fp, 4, SEEK_SET);
fwrite(&m_dwTotalSize, 1, sizeof(DWORD), m_fp);
fseek(m_fp, 40, SEEK_SET);
fwrite(&m_dwAudioSize, 1, sizeof(DWORD), m_fp);
fclose(m_fp);
m_fp = NULL;
}
}
protected:
BOOL m_fInited;
FILE *m_fp;
DWORD m_dwTotalSize;
DWORD m_dwAudioSize;
};