ortp分析之一例子分析-ren911的专栏-CSDN博客.doc

上传人:scccc 文档编号:11935356 上传时间:2021-11-05 格式:DOC 页数:7 大小:32.50KB
返回 下载 相关 举报
ortp分析之一例子分析-ren911的专栏-CSDN博客.doc_第1页
第1页 / 共7页
ortp分析之一例子分析-ren911的专栏-CSDN博客.doc_第2页
第2页 / 共7页
ortp分析之一例子分析-ren911的专栏-CSDN博客.doc_第3页
第3页 / 共7页
ortp分析之一例子分析-ren911的专栏-CSDN博客.doc_第4页
第4页 / 共7页
ortp分析之一例子分析-ren911的专栏-CSDN博客.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《ortp分析之一例子分析-ren911的专栏-CSDN博客.doc》由会员分享,可在线阅读,更多相关《ortp分析之一例子分析-ren911的专栏-CSDN博客.doc(7页珍藏版)》请在三一文库上搜索。

1、ortp 分析之一 例子分析 - ren911 的专栏 - CSDN 博客一 . rtpsend.c 主要内容这个例子主要是表示了 PCMU 格式的音频文件或者直接从 声卡得到的音频流如何发送int main(int argc, char *argv)RtpSession *session;unsigned char buffer160;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

2、if(strcmp(argvi,-with-clockslide)=0)i+;if (i>=argc) printf(%s, help); return -1;clockslide=atoi(argvi);ortp_message(Using clockslide of %imilisecond every 50 packets.,clockslide);else if (strcmp(argvi,-with-jitter)=0) ortp_message(Jitter will be added to outgoing stream.);i+;if (i>=argc) print

3、f(%s, help); return -1;jitter=atoi(argvi);/初始化 oRTP 库,应该在使用 oRTP API 前使用 ortp_init();/设置计划, scheduler 可以管理多个 session, 在接收端可以通过 select 来接收多个 session 。常见的就是音频视频 分两路传输,这个和后面结合起来,后面的基本都是对 session 的设置,比如对两个 session 设置不同的 payload 等ortp_scheduler_init();/设置记录级别ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WAR

4、NING|ORTP_ERROR);/创建一个新的 rtp 会话,如果这个会话能够发送数据( RTP_SESSION_SENDONLY or RTP_SESSION_SENDRECV ),输出流会被赋予一个随机 的 SSRC 数session=rtp_session_new(RTP_SESSION_SENDONLY); rtp_session_set_scheduling_mode(session,1);/* 此函数在 yesno (第二个参数) 为 TRUE 时隐式的启动计 划表模式。它定义 rtp_session_recv_with_ts() 和 rtp_session_send_with_

5、ts() 的行为。为 TRUE 时, rtp_session_recv_with_ts() 在下一个接收包的时间到达前将 会阻塞,根据传给函数的时间戳。 在这个事件后, 函数返回。 对于 rtp_session_send_with_ts(), 它将会在包被发送的时间 到达前阻塞。如果是 FALSE ,这两个函数将会立即返回。rtp_session_set_blocking_mode(session,1);/* 如果为 TRUE ,一个 connect ()系统调用将在发送到目 的地的 socket 上使用,如果会话使用 symmetric rtp (见 rtp_session_set_symm

6、etric_rtp() ,主要用于穿越防火墙) , 一个 connect ()在第一个包接收后将对源地址使用。连接 一个 socket 会造成拒绝所有不是从在 connect ()里指定的 地址发送过来的包。它也会造成应用程序可以检测道德 ICMP 错误。*/ rtp_session_set_connected_mode(session,TRUE);/设置远端地址rtp_session_set_remote_addr(session,argv2,atoi(argv3);/ 设置希望接收的包和将要发送的包的负载类型。如果接收 包中的负载类型和希望的不同,将会发出 payload_type_cha

7、nged 信号。可以对这个信号挂载函数处 理。/这里设置为 0,实际表示 payload type 为 PCMU , ortp 里 面这个设置不光设置数字就行了, 还需要 avprofile 中定义的 payload 结构,负责会报无法识别的 typertp_session_set_payload_type(session,0); ssrc=getenv(SSRC); if (ssrc!=NULL) printf(using SSRC=%i.n,atoi(ssrc);/ 设置输出流的 SSRC 。不做此步的话将会给个随机值 rtp_session_set_ssrc(session,atoi(s

8、src);#ifndef _WIN32 infile=fopen(argv1,r);#elseinfile=fopen(argv1,rb);#endifif (infile=NULL) perror(Cannot open file);return -1;signal(SIGINT,stophandler);while( (i=fread(buffer,1,160,infile)>0) &&(runcond) )/* 发送一个 rtp 数据报,通过 rtp_session_set_remote_addr() 设置目的地,以时间戳发送数据。这是一个高阶函数,它使 用了 rt

9、p_session_create_packet() 和rtp_session_sendm_with_ts() 来发送数据。*/* 发送一个 rtp 数据报,通过 rtp_session_set_remote_addr() 设置目的地,以时间戳发送数据。对音频数据,时间戳是第 一个采样结果的序号。 Packet ()在发送完后立即释放。 */rtp_session_send_with_ts(session,buffer,i,user_ts); user_ts+=160;if (clockslide!=0 && user_ts%(160*50)=0)ortp_message(Clo

10、ck sliding of %imiliseconds now,clockslide);/* 设置时间偏移void rtp_session_make_time_distorsion(RtpSession*session, int milisec)session->rtp.snd_time_offset+=milisec;*/rtp_session_make_time_distorsion(session,clockslide);/* 以下将会模拟一些爆发的延迟包*/*this will simulate a burst of late packets */ if (jitter &

11、;& (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;本文来自 CSDN 博客,转载请标明出处: spx

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1