对于客户端来说,接受语音数据并进行播放时最关键的。下面是我写的小程序:
CStringArray aResult;
CPData * p = new CPData();
p->Connect("sa","sa");
p->Select("select telstate from channelpara where channelno=0",aResult);
int no = aResult.GetSize();
for(int i=0;i<no;i++)
{
m_list.InsertString(-1,aResult.GetAt(i));
}
WSADATA wsaData; //进行初始化
int nRet=WSAStartup(MAKEWORD(2,2),&wsaData);
if(nRet!=NO_ERROR)
AfxMessageBox("socket 初始化错误!");
SOCKET aaa;
aaa = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr("202.118.19.192");
service.sin_port=htons((short)60000);
connect(aaa,(LPSOCKADDR)&service,sizeof(SOCKADDR));
char buf[2]={'0','/0'};
char buffer[4096];
int Ret;
long lLen = 0;
send(aaa,buf,1,0);
p->Select("select telstate from channelpara where channelno=0",aResult);
CFile file;
CString strFileName;
strFileName="hello.wav";
while(aResult.GetAt(0).Compare("0")!=0)
{
file.Open(strFileName,CFile::modeCreate|CFile::modeWrite);
file.Seek(sizeof(WAVEFILEHDR),CFile::begin);
while(lLen<20000&&aResult.GetAt(0).Compare("0")!=0)
{
Ret = recv(aaa,buffer,4096,0);
if(Ret>0)
{
lLen+=Ret;
file.Write(buffer,Ret);
}
p->Select("select telstate from channelpara where channelno=0",aResult);
}
WAVEFILEHDR wfd =
{ 'R', 'I', 'F', 'F', 0,
'W', 'A', 'V', 'E',
'f', 'm', 't', ' ', 16,
WAVE_FORMAT_PCM, 1, 8000, 8000, 1, 8,
'd', 'a', 't', 'a', 0
};
wfd.dwFileDataSize = lLen + sizeof(WAVEFILEHDR)- 8;
wfd.dwDataSize = lLen;
file.SeekToBegin();
file.Write(&wfd,sizeof(WAVEFILEHDR));
file.Close();
lLen=0;
sndPlaySound(strFileName,SND_SYNC);
p->Select("select telstate from channelpara where channelno=0",aResult);
}
closesocket(aaa);
WSACleanup();
p->DisConnect();
delete p;
其中WAVEFILEHDR的结构为:
typedef struct
{
char RiffId[4]; // "RIFF"
DWORD dwFileDataSize; // file size - 8
char WaveId[4]; // "WAVE"
char FMTId[4]; // "fmt "
DWORD dwFmtSize; // 16
WORD wFormatTag; // WAVE_FORMAT_PCM
WORD wChannels; // 1
DWORD dwSamplesPerSec; // 11025
DWORD dwAvgBytesPerSec; // 11025
WORD wBlockAlign; // 1
WORD wBitsPerSample; // 8
char DataId[4]; // "data"
DWORD dwDataSize;
} WAVEFILEHDR, *PWAVEFILEHDR;