ORTP部分
1.获取ortp源码 git clone https://github.com/dmonakhov/ortp
2. 增加H.264的payload支持,在src/avprofile.c的av_profile_init函数中357行添加:
rtp_profile_set_payload(profile,96,&payload_type_h264);
注意: payload_type_h264这个是有在源码中定义的,我们只需要去添加就可以了
3.先移植吧,之后再来分析这个库,根据: 去修改和移植
4.最后粗搜放入demo.sdp文件分析如下:

m=video 8080 RTP/AVP 96
 a=rtpmap:96 H264
 a=framerate:15
 c=IN IP4 192.168.1.177m=是媒体级会话的开始处,video:媒体类型 ; 8080:端口号; RTP/AVP:传输协议; 96:rtp头中的payload格式,96是h.264格式的码流
a=rtpmap:证明是动态绑定的进一步说明 ;96:rtp头中的payload格式;H264:编码名 ;缺省了时钟速率,应该为90000,这里的90000是指1s采集90000个字节
a=framerate:25 指1s播放几个rtp包,单位帧每秒,倒数为一个rtp包承载的数据播放的时间,单位s
 90000/25 表示每个时间戳增量值,这个在代码中也是有体现的c=:媒体链接信息;IN:网络类型一般为IN;IP4:地址类型一般为IP4;后面是IP地址(注意是VLC所在的IP地址,不是发送方的IP)
5.ortp库源码分析:
 ortp_init();//ortp的初始化
 av_profile_init(&av_profile); //初始化profile,使得ortp能够支持不同格式音视频的传输
 ortp_global_stats_reset(); //初始化全局变量(置零)
 init_random_number_generator();//产生随机数
 ortp_scheduler_init(); //初始化调度器(里面是一个定时器),决定资源分配,调度任务里面的多个会话,一个会话就是一个通信。
 //通过会话来管理数据发送和接收,
 ortp_set_log_level_mask //记录log信息
 rtp_session_new //创建一个会话,本质是一个结构体,管理很多信息//设置会话属性
 rtp_session_set_scheduling_mode(session,1);
 rtp_session_set_blocking_mode(session,1);
 rtp_session_set_connected_mode(session,TRUE);
 rtp_session_set_remote_addr(session,argv[2],atoi(argv[3]));
 rtp_session_set_payload_type(session,0);ssrc=getenv(“SSRC”); //同步源标志 SSRC表示会话里面的参与方,通过SSRC来匹配这个数据包属于谁的,
 if (ssrc!=NULL) {
 printf(“using SSRC=%i.\n”,atoi(ssrc));
 rtp_session_set_ssrc(session,atoi(ssrc));
 }
 rtp_session_send_with_ts(session,buffer,i,user_ts); //发送数据
 rtp_session_create_packet_with_data(session,(uint8_t*)buffer,len,NULL);//准备包,给数据添加包头
 rtp_session_sendm_with_ts(session,m,userts); //发送数据

总结一下:
1.ortp库是基于UDP协议的,和VLC传输数据的过程中,VLC打开sda文件之后,相当于是一个服务器,ortp库相当于是一个客户端,ortp把视频数据传到vlc
2.udp协议协议中:
一般可以使用 snedto 和 recvfrom来进行数据的交换
3.分析ortp源码中,使用的是sendmsg函数来进行数据的发送的
4.sendmsg和recvmsg也是两个很重要的网络数据收发函数
5.这两个函数详细细节没有去研究:参考此博客:


6.在网络调试的过程中,有两个很重要的工具,需要去学习使用,之后会有相关的文档
netstat 的用法
tcpdump 的用法