www.gusucode.com > 基于RTP语音压缩解压缩的发送与接收代码 > 基于RTP语音压缩解压缩的发送与接收代码/recv/rtp.cpp
#define _RTP_C #include "rtp.h" // // This function checks if there was a RTP error. If so, it displays an error // message and exists. // void rtpCheckError(int rtperr) { if (rtperr < 0) { printf( "Error: %s\n", RTPGetErrorString(rtperr).c_str() ); // std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl; exit(-1); } } int rtpInitEnv( void ) { int i, portbase; RTPUDPv4TransmissionParams transparams; RTPSessionParams sessparams; int status; #ifdef WIN32 WSADATA dat; WSAStartup(MAKEWORD(2,2),&dat); #endif // WIN32 std::cout << "Enter local portbase:" << std::endl; std::cin >> portbase; std::cout << std::endl; sessparams.SetOwnTimestampUnit(1.0/10.0); sessparams.SetAcceptOwnPackets(true); transparams.SetPortbase(portbase); status = sess.Create(sessparams,&transparams); rtpCheckError(status); for( i=0; i<MaxRtpChan; i++ ) { rRtpData[i].rStatus = StsIdle; rRtpData[i].fp = NULL; rRtpData[i].nBuffLen = 0; } return 0; } int rtpClose( void ) { int i; sess.BYEDestroy(RTPTime(10,0),0,0); for( i=0; i<MaxRtpChan; i++ ) fclose(rRtpData[i].fp); #ifdef WIN32 WSACleanup(); #endif // WIN32 return 0; } int rtpRecvPacket( void ) { u_int8_t *sData; int nPort; RTPPacket *pack; RTPIPv4Address *addr; sess.BeginDataAccess(); // check incoming packets if (sess.GotoFirstSourceWithData()) { do { while ((pack = sess.GetNextPacket()) != NULL) { // You can examine the data here addr = (RTPIPv4Address *)sess.GetCurrentSourceInfo()->GetRTPDataAddress(); nPort = (addr->GetPort()) ; /* printf( "Got packet: length=%d, Seq=%d, PayloadType=%d, from: SSRC=%d, %d\n", pack->GetPayloadLength(), pack->GetExtendedSequenceNumber(), pack->GetPayloadType(), pack->GetSSRC(), nPort ); */ sData = pack->GetPayloadData(); #ifdef SaveDataToFile if( rRtpData[nPort].fp == NULL ) { char sFile[20]; sprintf( sFile, "rtp%05d.pcm", nPort ); rRtpData[nPort].fp = fopen( sFile, "w" ); } printf("save data to file\n"); fwrite( sData, pack->GetPayloadLength(), 1, rRtpData[nPort].fp ); #endif // SaveDataToFile if( rRtpData[nPort].nBuffLen + pack->GetPayloadLength() < MaxRtpBuff ) { memcpy( rRtpData[nPort].sDataBuff + rRtpData[nPort].nBuffLen, sData, pack->GetPayloadLength() ); rRtpData[nPort].nBuffLen += pack->GetPayloadLength(); if( rRtpData[nPort].rStatus == StsIdle ) rRtpData[nPort].rStatus = StsNeedWork; } // we don't longer need the packet, so // we'll delete it delete pack; } } while (sess.GotoNextSourceWithData()); } sess.EndDataAccess(); #ifndef RTP_SUPPORT_THREAD status = sess.Poll(); rtpCheckError(status); #endif // RTP_SUPPORT_THREAD return 0; }