需要实现接受局域网内的音频数据然后实时播放出来,网络协议采用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)才能正常完整地放音。请教各位高手,现在我干怎么解决这些问题呢??非常感谢,这些天被这个了弄得头都大了,希望大家指教!!

解决方案 »

  1.   

    memcpy(sound.m_cBufferOut,rbuff,MAX_BUFFER_SIZE);你的rbuff里面的音频数据有没有MAX_BUFFER_SIZE这么大?不一定接收了那么多,应该使用具体接收了的数据.或者当rbuff的数据大于max_buffer_size后才播放.sleep是因为网络传输需要一定的时间的,太快播放传输的数据就不完全.
      

  2.   

    look 一下directshow 里面的例子:DSNetwork,很清楚的。
      

  3.   

    To dirdirdir3(风) :你好,我的rbuff的大小和MAX_BUFFER_SIZE的大小设的是一样的,都是一个数据报的长度,为512。我听到的声音基本上是连续的,但是播放的过程中总是不是很清晰,这是什么原因呢?
      

  4.   

    To icebluenet(冰蓝泠):directshow安装是不是很麻烦阿,您能具体我这个程序说说问题吗?谢谢
      

  5.   

    呵呵,没事,来csdn上晃,居然发现你的帖子,问题我都帮你解决了,接分了~~~