📄 receiver.cpp
字号:
/* Here's a small IPv4 example: it asks for a portbase and a destination and starts sending packets to that destination.*/#include "rtpsession.h"#include "rtppacket.h"#include "rtpudpv4transmitter.h"#include "rtpipv4address.h"#include "rtpsessionparams.h"#include "rtperrors.h"#ifndef WIN32 #include <netinet/in.h> #include <arpa/inet.h>#else #include <winsock2.h>#endif // WIN32#include <stdlib.h>#include <stdio.h>#include <iostream>#include <string>//// This function checks if there was a RTP error. If so, it displays an error// message and exists.//void checkerror(int rtperr){ if (rtperr < 0) { std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl; exit(-1); }}//// The main routine//int main(void){#ifdef WIN32 WSADATA dat; WSAStartup(MAKEWORD(2,2),&dat);#endif // WIN32 RTPSession sess; u_int16_t portbase,destport; u_int32_t destip; std::string ipstr; int status,i, num; FILE *fp[50];
portbase = 6000;/*
// First, we'll ask for the necessary information std::cout << "Enter local portbase:" << std::endl; std::cin >> portbase; std::cout << std::endl; std::cout << "Enter the destination IP address" << std::endl; std::cin >> ipstr; destip = inet_addr(ipstr.c_str()); if (destip == INADDR_NONE) { std::cerr << "Bad IP address specified" << std::endl; return -1; } // The inet_addr function returns a value in network byte order, but // we need the IP address in host byte order, so we use a call to // ntohl destip = ntohl(destip); std::cout << "Enter the destination port" << std::endl; std::cin >> destport; std::cout << std::endl; std::cout << "Number of packets you wish to be sent:" << std::endl; std::cin >> num;*/ // Now, we'll create a RTP session, set the destination, send some // packets and poll for incoming data. RTPUDPv4TransmissionParams transparams; RTPSessionParams sessparams; // IMPORTANT: The local timestamp unit MUST be set, otherwise // RTCP Sender Report info will be calculated wrong // In this case, we'll be sending 10 samples each second, so we'll // put the timestamp unit to (1.0/10.0) sessparams.SetOwnTimestampUnit(1.0/10.0); sessparams.SetAcceptOwnPackets(true); transparams.SetPortbase(portbase); status = sess.Create(sessparams,&transparams); checkerror(status); /* RTPIPv4Address addr(destip,destport); status = sess.AddDestination(addr); checkerror(status);*/ for( i=0; i<50; i++ ) fp[i] = NULL; num = 0; printf("\nReceiving packet.. \n"); for ( ; ; ) {/* printf("\nSending packet %d/%d\n",i,num); // send the packet status = sess.SendPacket((void *)"1234567890",10,0,false,10); checkerror(status);*/ sess.BeginDataAccess(); // check incoming packets if (sess.GotoFirstSourceWithData()) { do { RTPPacket *pack; u_int8_t *sData; int nPort; while ((pack = sess.GetNextPacket()) != NULL) { // You can examine the data here RTPIPv4Address *addr = (RTPIPv4Address *)sess.GetCurrentSourceInfo()->GetRTPDataAddress(); nPort = addr->GetPort(); printf( "Got packet: length=%d, Seq=%d, from: SSRC=%d, %d len = %d\n", pack->GetPayloadLength(), pack->GetExtendedSequenceNumber(), pack->GetSSRC(), nPort, num ); if( fp[nPort-6000] == NULL ) { char sFile[128]; sprintf( sFile, "rtp%04d.pcm", nPort-6000 ); fp[nPort-6000] = fopen( sFile, "w" ); } sData = pack->GetPayloadData();
num += pack->GetPayloadLength();
fwrite( sData, pack->GetPayloadLength(), 1, fp[nPort-6000] );
fflush( fp[nPort-6000] );
/*
for( i=0; i<pack->GetPacketLength(); i++ ) fprintf( fp, "%02x ", sData[i] ); fprintf( fp, "\n" );*/
// 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(); checkerror(status);#endif // RTP_SUPPORT_THREAD RTPTime::Wait(RTPTime(0,20)); } sess.BYEDestroy(RTPTime(10,0),0,0);
for( i=0; i<50; i++ ) fclose(fp[i]);#ifdef WIN32 WSACleanup();#endif // WIN32 return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -