ortp发送示例程序备注

以下内容是我参考前辈文章内容,对ORTP自带的test发送程序备注的修改

引用文章:

ortp分析之一 例子分析

ortp库API说明

#include <ortp/ortp.h>
#include <signal.h>
#include <stdlib.h>


#ifndef _WIN32 
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#endif


int runcond=1;


void stophandler(int signum)
{
	runcond=0;
}


static const char *help="usage: rtpsend	filename dest_ip4addr dest_port [ --with-clockslide <value> ] [ --with-jitter <milliseconds>]\n";


int main(int argc, char *argv[])
{
	RtpSession *session;//rtp会话结构体
	unsigned char buffer[160];
	int i;
	FILE *infile;
	char *ssrc;
	uint32_t user_ts=0;
	int clockslide=0;
	int jitter=0;
	if (argc<4){
		printf("%s", help);
		return -1;
	}
	for(i=4;i<argc;i++){
		if (strcmp(argv[i],"--with-clockslide")==0){
			i++;
			if (i>=argc) {
				printf("%s", help);
				return -1;
			}
			clockslide=atoi(argv[i]);
			ortp_message("Using clockslide of %i milisecond every 50 packets.",clockslide);
		}else if (strcmp(argv[i],"--with-jitter")==0){
			ortp_message("Jitter will be added to outgoing stream.");
			i++;
			if (i>=argc) {
				printf("%s", help);
				return -1;
			}
			jitter=atoi(argv[i]);
		}
	}
	//初始化oRTP库,应该在使用oRTP API前使用
	ortp_init();
	//设置计划,scheduler可以管理多个session,在接收端可以通过select来接收多个session。常见的就是音频视频分两路传输, 这个和后面结合起来,后面的基本都是对session的设置,比如对两个session设置不同的payload等
	ortp_scheduler_init();
	//设置记录级别
	ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
	//创建一个新的rtp会话,如果这个会话能够发送数据(RTP_SESSION_SENDONLY or RTP_SESSION_SENDRECV or RTP_SESSION_SENDRECV),输出流会被赋予一个随机的SSRC数
	session=rtp_session_new(RTP_SESSION_SENDONLY);	
	
	/*
	为1,则表明使用系统的session调度管理功能,意味着可以使用以下功能:
	1. 可以使用session_set_select在多个rtp会话之间进行选择,根据时间戳判定某个会话是否到达了收发的时间。
	2. 可以使用rtp_session_set_blocking_mode()设置是否使用阻塞模式来进行rtp包的发送和接收。
	*/
	rtp_session_set_scheduling_mode(session,1);
	/*
	设置采用阻塞模式
	rtp_session_recv_with_ts()会一直阻塞直到接收RTP包的时间点到达(这个时间点由该函数参数中所定义的时间戳来决定),当接收完RTP数据包后,该函数才会返回。同样,rtp_session_send_with_ts()也会一直阻塞直到需要被发送的RTP包的时间点到达,发送结束后,函数才返回。
	*/
	rtp_session_set_blocking_mode(session,1);
	
	rtp_session_set_connected_mode(session,TRUE);
	//设置RTP发送的目的地址  IP 端口
	rtp_session_set_remote_addr(session,argv[2],atoi(argv[3]));
	
	// 设置希望接收的包和将要发送的包的负载类型。如果接收包中的负载类型和希望的不同,将会发出payload_type_changed信号。可以对这个信号挂载函数处理。


//这里设置为0,实际表示payload type为PCMU,ortp里面这个设置不光设置数字就行了,还需要avprofile.c中定义的payload结构,否则会报无法识别的type.payloadtype.h
	rtp_session_set_payload_type(session,0);//payload_type_h264
	
	ssrc=getenv("SSRC");
	if (ssrc!=NULL) {
		printf("using SSRC=%i.\n",atoi(ssrc));
		rtp_session_set_ssrc(session,atoi(ssrc));// 设置输出流的SSRC。不做此步的话将会给个随机值
	}
		
	#ifndef _WIN32
	infile=fopen(argv[1],"r");
	#else
	infile=fopen(argv[1],"rb");//打开输入文件
	#endif


	if (infile==NULL) {
		perror("Cannot open file");
		return -1;
	}


	signal(SIGINT,stophandler);
	while( ((i=fread(buffer,1,160,infile))>0) && (runcond) )
	{
	/*
		函数功能:发送RTP数据包
	参数含义:
	session: rtp会话结构体
	buffer: 需要发送的RTP数据的缓冲区
	len:    需要发送的RTP数据的长度
	userts: 本RTP数据包的时间戳
	返回值: 成功发送到网络中的字节数
	说明:
	发送RTP数据需要自己管理时间戳的递增,每调用一次本函数,请根据实际情况对userts进行递增,具体递增的规则见RTP协议中的说明。
	例如:如果发送的是采样率为90000Hz的视频数据包,每秒25帧,则时间戳的增量为:90000/25 = 3600
	时间戳的起始值为随机值,建议设置为0 。
	*/
		rtp_session_send_with_ts(session,buffer,i,user_ts);
		user_ts+=160;
		if (clockslide!=0 && user_ts%(160*50)==0){
			ortp_message("Clock sliding of %i miliseconds now",clockslide);
			rtp_session_make_time_distorsion(session,clockslide);
		}
		/*this will simulate a burst of late packets */
		if (jitter && (user_ts%(8000)==0)) {
			struct timespec pausetime, remtime;
			ortp_message("Simulating late packets now (%i milliseconds)",jitter);
			pausetime.tv_sec=jitter/1000;
			pausetime.tv_nsec=(jitter%1000)*1000000;
			while(nanosleep(&pausetime,&remtime)==-1 && errno==EINTR){
				pausetime=remtime;
			}
		}
	}


	fclose(infile);
	rtp_session_destroy(session);
	ortp_exit();
	ortp_global_stats_display();


	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值