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 的用法