发送和接收用的是一个rtpSession对象,发送RTP包没有问题,但是接收有问题.
DWORD WINAPI RecvRtpThread(LPVOID param)
{
int len;
RTPPacket *pack;
while(1)
{
m_rtpAsession.PollData(); //接收RTP数据
if (m_rtpAsession.GotoFirstSourceWithData()) //检索RTP数据源
{
do //递归搜索RTP包中的数据
{
while ((pack = m_rtpAsession.GetNextPacket()) != NULL)
{
len = 0;
//每个包的长度都是: len =4423856
//感觉数据包长度有问题...
len = pack->GetPayloadLength();
if(len > SIZE_AUDIO_PACKED2 /*|| pack->GetExtendedSequenceNumber() <= seq*/)
continue;
char* buf = new char[SIZE_AUDIO_PACKED2];
memcpy(buf, (char*)pack->GetPayload(), len);
//memcpy(&buf,(char*)pack->GetPayload(),len); EnterCriticalSection(&cs_cli_Info);
{
va_g729a_init_decoder();
char *pin = new char[SIZE_AUDIO_PACKED2];
char *pout = new char[SIZE_AUDIO_FRAME2];
memset(pin, 0, SIZE_AUDIO_PACKED2); //60
memset(pout, 0, SIZE_AUDIO_FRAME2); //960
memcpy(pin, buf, len); va_g729a_decoder((BYTE*)pin, (short*)(pout),0); //使用G729库解码
//va_g729a_decoder((BYTE*)pin+10, (short*)(pout+160),0);
char *str=new char[SIZE_AUDIO_FRAME2]; //960字节
if(str==NULL)
{
str=new char[SIZE_AUDIO_FRAME2];
}
memset(str,0,SIZE_AUDIO_FRAME2);
memcpy(str, pout,SIZE_AUDIO_FRAME2);
EnterCriticalSection(&cs_play_queue);
wave_play_Data.push(str); //需要播放的数据块, 放入消息队列中
LeaveCriticalSection(&cs_play_queue); delete []pout;
delete []pin;
}
LeaveCriticalSection(&cs_cli_Info);
delete pack;
} //while ((pack = m_rtpAsession.GetNextPacket()) != NULL)
} while (m_rtpAsession.GotoNextSourceWithData());
} //if (m_rtpAsession.GotoFirstSourceWithData())
Sleep(1);
} //while(1)
return 0;
}
DWORD WINAPI RecvRtpThread(LPVOID param)
{
int len;
RTPPacket *pack;
while(1)
{
m_rtpAsession.PollData(); //接收RTP数据
if (m_rtpAsession.GotoFirstSourceWithData()) //检索RTP数据源
{
do //递归搜索RTP包中的数据
{
while ((pack = m_rtpAsession.GetNextPacket()) != NULL)
{
len = 0;
//每个包的长度都是: len =4423856
//感觉数据包长度有问题...
len = pack->GetPayloadLength();
if(len > SIZE_AUDIO_PACKED2 /*|| pack->GetExtendedSequenceNumber() <= seq*/)
continue;
char* buf = new char[SIZE_AUDIO_PACKED2];
memcpy(buf, (char*)pack->GetPayload(), len);
//memcpy(&buf,(char*)pack->GetPayload(),len); EnterCriticalSection(&cs_cli_Info);
{
va_g729a_init_decoder();
char *pin = new char[SIZE_AUDIO_PACKED2];
char *pout = new char[SIZE_AUDIO_FRAME2];
memset(pin, 0, SIZE_AUDIO_PACKED2); //60
memset(pout, 0, SIZE_AUDIO_FRAME2); //960
memcpy(pin, buf, len); va_g729a_decoder((BYTE*)pin, (short*)(pout),0); //使用G729库解码
//va_g729a_decoder((BYTE*)pin+10, (short*)(pout+160),0);
char *str=new char[SIZE_AUDIO_FRAME2]; //960字节
if(str==NULL)
{
str=new char[SIZE_AUDIO_FRAME2];
}
memset(str,0,SIZE_AUDIO_FRAME2);
memcpy(str, pout,SIZE_AUDIO_FRAME2);
EnterCriticalSection(&cs_play_queue);
wave_play_Data.push(str); //需要播放的数据块, 放入消息队列中
LeaveCriticalSection(&cs_play_queue); delete []pout;
delete []pin;
}
LeaveCriticalSection(&cs_cli_Info);
delete pack;
} //while ((pack = m_rtpAsession.GetNextPacket()) != NULL)
} while (m_rtpAsession.GotoNextSourceWithData());
} //if (m_rtpAsession.GotoFirstSourceWithData())
Sleep(1);
} //while(1)
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货