需要实现接受局域网内的音频数据然后实时播放出来,网络协议采用TCP/IP。现在写的主函数如下:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
// 创建套节字
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}
// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定这个套节字到一个本地地址
if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}
// 进入监听模式
if(::listen(sListen, 2) == SOCKET_ERROR)
{
printf("Failed listen() \n");
return 0;
}
// 循环接受客户的连接请求
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
short PcmRcvBuff[1024*320];
int rcvtotalcode=0;
int Flag=1024*320-512;
ofstream outfile;
while(TRUE)
{
// 接受一个新连接
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
{
printf("Failed accept()");
continue;
}
printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
printf("接收数据:\n");
char rbuff[SendPktLen];
int recv_count=0;
CWaveplayDlg dlg;
sound.Init(&dlg);
/* int nResponse = dlg.DoModal();*/
while(TRUE)
{
Sleep(27);
memset(rbuff,0,SendPktLen);
int nRecv=::recv(sClient,rbuff,SendPktLen,0);
memcpy(sound.m_cBufferOut,rbuff,MAX_BUFFER_SIZE);
sound.Play();
sound.FreePlayBuffer();
}
::closesocket(sClient);
}
// 关闭监听套节字
::closesocket(sListen); return 0; } return nRetCode;
}
在第二个while(TRUE)前,用CWaveplayDlg dlg和sound.Init(&dlg)对声卡进行初始化,参考的是网络上一个录音放音的CSound类,我这里只在后面用了跟放音有关的函数sound.Play()和sound.FreePlayBuffer();从网络接收到的数据放到了rbuff缓冲区,在通过memcpy(sound.m_cBufferOut,rbuff,MAX_BUFFER_SIZE)将数据传到放音的缓冲区m_cBufferOut中。现在的问题是:
1)放音的时候效果非常得不好,总是有噪音之类的干扰声音;
2)放音函数之前要加入sleep(27)才能正常完整地放音。请教各位高手,现在我干怎么解决这些问题呢??非常感谢,这些天被这个了弄得头都大了,希望大家指教!!
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
// 创建套节字
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}
// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定这个套节字到一个本地地址
if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}
// 进入监听模式
if(::listen(sListen, 2) == SOCKET_ERROR)
{
printf("Failed listen() \n");
return 0;
}
// 循环接受客户的连接请求
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
short PcmRcvBuff[1024*320];
int rcvtotalcode=0;
int Flag=1024*320-512;
ofstream outfile;
while(TRUE)
{
// 接受一个新连接
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
{
printf("Failed accept()");
continue;
}
printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
printf("接收数据:\n");
char rbuff[SendPktLen];
int recv_count=0;
CWaveplayDlg dlg;
sound.Init(&dlg);
/* int nResponse = dlg.DoModal();*/
while(TRUE)
{
Sleep(27);
memset(rbuff,0,SendPktLen);
int nRecv=::recv(sClient,rbuff,SendPktLen,0);
memcpy(sound.m_cBufferOut,rbuff,MAX_BUFFER_SIZE);
sound.Play();
sound.FreePlayBuffer();
}
::closesocket(sClient);
}
// 关闭监听套节字
::closesocket(sListen); return 0; } return nRetCode;
}
在第二个while(TRUE)前,用CWaveplayDlg dlg和sound.Init(&dlg)对声卡进行初始化,参考的是网络上一个录音放音的CSound类,我这里只在后面用了跟放音有关的函数sound.Play()和sound.FreePlayBuffer();从网络接收到的数据放到了rbuff缓冲区,在通过memcpy(sound.m_cBufferOut,rbuff,MAX_BUFFER_SIZE)将数据传到放音的缓冲区m_cBufferOut中。现在的问题是:
1)放音的时候效果非常得不好,总是有噪音之类的干扰声音;
2)放音函数之前要加入sleep(27)才能正常完整地放音。请教各位高手,现在我干怎么解决这些问题呢??非常感谢,这些天被这个了弄得头都大了,希望大家指教!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货