怎么将语音通信中双方(甚至多人)的语音保存在一个文件中?

starytx 2007-11-30 10:46:15
在做一个语音通信程序,现在在保存语音纪录是遇到问题:如何将双方或者多人的语音数据混合起来保存到一个文件中。我使用下边的这个类可以保存单个人的(自己的,或者对方的),没有压缩,直接保存成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;
};
...全文
344 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2007-12-04
  • 打赏
  • 举报
回复
哦,多谢提醒!
xjfox 2007-12-04
  • 打赏
  • 举报
回复
来接分了,呵呵

做越界判断的时候的确要注意数据类型

比如8bit的相加的结果用short保存,16bit的相加结果用int保存,否则你的判断可能是无效的
rageliu 2007-12-01
  • 打赏
  • 举报
回复
DES
starytx 2007-12-01
  • 打赏
  • 举报
回复
楼上的什么意思?“在软件中将发送和传输的音频数据流抓录下来”,这个数据还用抓录吗?不是现成的吗?我的意思是怎么把我和其他人进行的通话揉在一起保存在一个文件中,这样播放的时候就好比在听对话,而录音和放音不是在一起的,不知道怎么混在一起,将声卡录音采集选择“波形输出混音”,然后在通话时保存麦克风采集的声音可以达到我的目的但同时却影响了其他人的收听(其他人听到的是我保存进文件的声音,也就是能听到自己的回音),感觉是个矛盾,不知有没有其他好办法
billnie 2007-12-01
  • 打赏
  • 举报
回复
这种方法除了录当前通话的声音,还可能将电脑中的其它声音录下来了,还有一种方法就是在软件中将发送和传输的音频数据流抓录下来
starytx 2007-12-01
  • 打赏
  • 举报
回复
我试了一下,采集设置成混音可以将所有人的声音混合起来,但同时也影响了其他人的收听,他们听到的有自己的回音,不知道有没有办法可以采集本机语音时从麦克风录入,保存通信纪录时采用混音录入,呵呵,估计比较难弄了。
starytx 2007-12-01
  • 打赏
  • 举报
回复
设置成音频混合后,那它不影响别人听到的我录制并发送过去的声音吗?也就是说其他人听到的是混合音吗?如果是那就不行
xdspower 2007-11-30
  • 打赏
  • 举报
回复
你录制的声卡采集选项选成音频混合,则所有那个时候采集的声音是计算机当时所有可用的采集通道和播出通道的混合,当然包括通过mic或者线路进入计算机的声音,也包括计算机播放出来的声音。
starytx 2007-11-30
  • 打赏
  • 举报
回复
这样就能把自己和别人的通话揉在一起保存吗?
billnie 2007-11-30
  • 打赏
  • 举报
回复
有一个简单的方法,可以写一个独立的录音程序,内录电脑声音就可以了,在建立通迅时,启动录音程序就可以了,结束时再停止录音。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧