例子1发送数据,本例接收数据,执行结果:/*This IPv4 example uses the background thread itself to process all packets.You can use example one to send data to the session that's created in thisexample.本IPv4示例仅仅使用后台线程来处理所有的数据包。你可以从示例1来发送数据到本示例创建的会话中。*/
#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 "rtpsourcedata.h"#include <stdlib.h>#include <stdio.h>#include <iostream>#include <string>
using namespace jrtplib ;
#ifdef RTP_SUPPORT_THREAD
//// This function checks if there was a RTP error. If so, it displays an error// message and exists.//本函数检查是否有RTP错误。如果有,本函数显示错误信息,然后退出。
void checkerror ( int rtperr ){if ( rtperr < 0 ){std :: cout << "ERROR: " << RTPGetErrorString ( rtperr ) << std :: endl ;exit ( - 1 );}}
//// The new class routine//一个新的继承自RTPSession的类
class MyRTPSession : public RTPSession{protected://轮询线程每次启动时被调用。每当检测到有传入的数据到达时, 或者当要发送一个RTCP复合数据包时,这便会发生。void OnPollThreadStep ();//对接收到的数据包进行处理void ProcessRTPPacket ( const RTPSourceData & srcdat , const RTPPacket & rtppack );};
void MyRTPSession :: OnPollThreadStep (){BeginDataAccess ();
// check incoming packets//检查发送进来的数据包if ( GotoFirstSourceWithData ()){do{RTPPacket * pack ;RTPSourceData * srcdat ;
srcdat = GetCurrentSourceInfo ();
while (( pack = GetNextPacket ()) != NULL ){//此处对接收到的数据包进行具体的处理ProcessRTPPacket ( * srcdat , * pack );DeletePacket ( pack );}} while ( GotoNextSourceWithData ());}
EndDataAccess ();}
//对接收到的数据包进行处理void MyRTPSession :: ProcessRTPPacket ( const RTPSourceData & srcdat , const RTPPacket & rtppack ){// You can inspect the packet and the source's info here// 你可以在此处检查数据包,以及该数据源的信息std :: cout << "Got packet " << rtppack . GetExtendedSequenceNumber () << " from SSRC " << srcdat . GetSSRC () << std :: endl ;}
//// The main routine// 主函数
int main ( void ){#ifdef WIN32WSADATA dat ;WSAStartup ( MAKEWORD ( 2 , 2 ), & dat );#endif // WIN32
MyRTPSession sess ;uint16_t portbase ;std :: string ipstr ;int status , num ;
// First, we'll ask for the necessary information// 首先,让用户输入一些必要的信息std :: cout << "Enter local portbase:" << std :: endl ;std :: cin >> portbase ;std :: cout << std :: endl ;
std :: cout << std :: endl ;std :: cout << "Number of seconds you wish to wait:" << std :: endl ;std :: cin >> num ;
// Now, we'll create a RTP session, set the destination// and poll for incoming data.//现在,我们将创建一个RTP会话,设置目的端点,然后轮询等待发进来的数据
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 just use 8000 samples per second.// 重要信息:本地的时间戳单位必须要设置,否则RTCP发送报告信息将会计算错误// 在本例,我们就用每秒8000个样本sessparams . SetOwnTimestampUnit ( 1.0 / 8000.0 );
transparams . SetPortbase ( portbase );status = sess . Create ( sessparams , & transparams );checkerror ( status );
// Wait a number of seconds// 等待几秒钟RTPTime :: Wait ( RTPTime ( num , 0 ));
sess . BYEDestroy ( RTPTime ( 10 , 0 ), 0 , 0 );
#ifdef WIN32WSACleanup ();#endif // WIN32return 0 ;}
#else
int main ( void ){std :: cerr << "Thread support is required for this example" << std :: endl ;//本例需要线程支持return 0 ;}
#endif // RTP_SUPPORT_THREAD
jrtplib3.9.1 example4
最新推荐文章于 2019-11-12 11:48:48 发布