在做一个语音通信程序,现在在保存语音纪录是遇到问题:如何将双方或者多人的语音数据混合起来保存到一个文件中。我使用下边的这个类可以保存单个人的(自己的,或者对方的),没有压缩,直接保存成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;
};
------解决方案--------------------------------------------------------
有一个简单的方法,可以写一个独立的录音程序,内录电脑声音就可以了,在建立通迅时,启动录音程序就可以了,结束时再停止录音。
------解决方案--------------------------------------------------------
你录制的声卡采集选项选成音频混合,则所有那个时候采集的声音是计算机当时所有可用的采集通道和播出通道的混合,当然包括通过mic或者线路进入计算机的声音,也包括计算机播放出来的声音。
------解决方案--------------------------------------------------------
来接分了,呵呵
做越界判断的时候的确要注意数据类型
比如8bit的相加的结果用short保存,16bit的相加结果用int保存,否则你的判断可能是无效的