三页搞定GB2818/SIP/RTP、PS封装
三页搞定GB2818/SIP/RTP、PS封装
(2016-08-23 18:27:20)
转载▼
标签:
it互联网gb28181siprtp |
分类: 技术 |
GB2818集成了sip通讯、RTP封装及PS流封装。初涉者不了解整体框架,如果每一项去啃读,每项有几百页的标准文档,啃完估计该吐血了。实际上虽然GB28181里用了3个项目,但每个单元基本都是固定的,用法比较简单。
一、关于SIP:GB28181里只是简单用了开源的eXosip2和osip2,有兴趣可以下载编绎,或直接使用别人编绎好和.h、.lib、.dll,初始化也蛮简单
1> 初始化
osip_trace_initialize(OSIP_INFO1, NULL);
long result = eXosip_init();
if (result != OSIP_SUCCESS)
return -1;
result = eXosip_listen_addr(IPPROTO_UDP, NULL, m_iMySipPort, AF_INET, 0);
if (result != OSIP_SUCCESS)
return -2;
result = eXosip_listen_addr(IPPROTO_TCP, NULL, m_iMySipPort, AF_INET, 0);
if (result != OSIP_SUCCESS)
return -3;
2>SIP消息处理线程
eXosip_event_t *pSipEvent;
while(m_bActiveSipMsgThread)
{
pSipEvent = eXosip_event_wait(0, 50);
eXosip_lock();
eXosip_default_action(pSipEvent);
eXosip_automatic_refresh();
eXosip_automatic_action();
eXosip_unlock();
if(pSipEvent==NULL)
continue;
switch(pSipEvent->type)
{
case EXOSIP_REGISTRATION_NEW://有注册进来
break;
case EXOSIP_REGISTRATION_REFRESHED:
break;
case EXOSIP_REGISTRATION_TERMINATED:
break;
case EXOSIP_CALL_NOANSWER:
break;
case EXOSIP_CALL_ANSWERED://请求视频流回复成功
break;
case EXOSIP_CALL_CANCELLED:
break;
case EXOSIP_CALL_TIMEOUT:
break;
case EXOSIP_CALL_CLOSED:
break;
case EXOSIP_CALL_MESSAGE_ANSWERED:
break;
case EXOSIP_MESSAGE_NEW://下级平台保活、设备查询回复
break;
case EXOSIP_MESSAGE_ANSWERED://查询
break;
case EXOSIP_REGISTRATION_FAILURE:
break;
case EXOSIP_REGISTRATION_SUCCESS:
break;
default:
break;
}
eXosip_event_free(pSipEvent);//释放
}
3>关于sdp
sSDP.Format("v=0\r\n"
"o=%s 0 0 IN IP4 %s\r\n" //owner/creator and session identifier
"s=%s\r\n" //session name
"c=IN IP4 %s\r\n"//connection information
"t=%d %d\r\n" //time the session is active
"m=video %d RTP/AVP 96 98\r\n" //media name and transport address
"a=recvonly\r\n" //zero or more session attribute lines
"a=rtpmap:96 PS/90000\r\n" //
"a=rtpmap:98 H264/90000\r\n"
"y=%d%sd\r\n", //SSRC Y字段:为十进制整数字符串,表示SSRC值。格式如下:D ddddd dddd(第一位为历史或实时媒体,2-5为SipID的中间(-8),4位StreamID
二、关于RTP
RTP定义本身很复杂,但在GB28181里很简单,基本就是固定的12个字节
每一帧视频或音频数据,先封装成ps流,再封装成RTP包,这个处理是gb28181里最为复杂的部分。
RTP头
struct RTPHeader
{
uint8_t csrccount:4;
uint8_t extension:1;
uint8_t padding:1;
uint8_t version:2;
uint8_t payloadtype:7;
uint8_t marker:1;
uint16_t sequencenumber;
uint32_t timestamp;
uint32_t ssrc;
};
细看比较复杂,其实就是一个12字节的头,后面是av数据。需要注意以下几个标识
Marker:如果为1,表明该帧已经结束,为0表示是连接的音视频数据
Sequencenumber:RTP包顺序,比如一帧K帧,200K,顺序可能是0-199,最后一个包Marker位为1。
Ssrc:为流标识,实际可以多个流往一个端口上发,通过此位标识。
Payloadlength:为该包的长度,如果是前面的包,此值通常为1024,最后一个长度为总长除1024的余数
Payloadoffset:通常为12,rtp头信息。
Timestamp:这个值并非每帧的时间戳,但是一个音频或视频包此项是相同的。
三、关于PS流封装
若干个PS包会组成一个AV包(Marker标识一帧结束),以00、00、01在个字节固定开头,至少需要6个字节,根据第4个字节判断是音频帧还是视频帧
0xBA :I帧(关键帧),后面还跟有8字节的ps pack header信息,即ps pack header信息长度为14字节。
0xBB: // ps system header <18字节>
0xBC:// ps map header <30字节>
0xC0:// 音频头
0xE0: //视频头 <19字节>
最后根据各字节解析出音视频包的实际长度。比如一个I帧为64400,则后面的64400/1024=63个包全是该I帧数据。音频帧要简单一些,没有ps header及map header.
四、注意事项
l 使用多线程接受UDP数据,如果用单线程,需要使用map去检索。
l 实际UDP包传输时如果网络情况不太好,它的到达顺序是不固定的,即有可能先发的包后收到,这个处理起来非常麻烦。如果使用链表排序又会降低系统性能。因此需要做好内存管理。
三页搞定GB2818/SIP/RTP、PS封装相关推荐
- android 图片墙拼贴,三步搞定 用APP打造图片文字拼贴效果
相信大家一定见过一种文字拼贴效果的图片,许多大小不一.字体不同.颜色各异的文字拼合出一幅完整的画面.如果你曾经也想自己制作这么一张高端大气上档次的独特图片,却苦于自己的PS水平不到家,那么一定不要错过 ...
- EasyExcel 三分钟搞定导入导出
前言:本文章教你从零开始,三分钟搞定excel单sheet导出.导入.多sheet导出.导入.excel模板导入单个sheet.多个sheet,废话不多说,直接上代码 1.引入依赖 <!--ex ...
- 三分钟搞定一个网页原型设计
三分钟搞定一个网页原型设计 PS插件之Velositey(撒福利一波吼~) 做设计的大佬们应该很熟这个插件了,主要安利给平时不玩设计的后台们,以及不想花时间在做重复框架上的同学,更多的时间快留给打磨属 ...
- Flash Builder4.7极其简单破解方法-三步搞定(亲测)
资讯类型: 转载 来源页面: http://weibo.com/2101024913/yvmR0D9Df 资讯原标题: 资讯原作者: 丿卓越丶星辰 翻译词数: 词 我的评论: 对这篇文你有啥看法,跟贴 ...
- 服务器添加管理员隐藏账号,绝招:隐藏管理员账号 三分钟搞定
绝招:隐藏管理员账号 三分钟搞定 更新时间:2007年07月30日 11:30:59 作者: 对regedit.exe大家都很熟悉,但却不能对注册表的项键设置权限,而regedt32.exe最大的 ...
- linux 无法定位程序,三步搞定无法定位程序输入点 于动态链接库上
三步搞定无法定位程序输入点 于动态链接库上 发布时间:2018-09-17 09:24 来源:互联网 当前栏目:电脑教程 上网的时候突然咚的一声弹出一个错误提示框,上边写着 iexplore.exe ...
- Flash Builder4.7极其简单破解方法-三步搞定
Flash Builder4.7极其简单破解方法-三步搞定(亲测) 原方法适用于4.6版本,同样方法4.7完美破解,不敢独享 具体步骤如下: 1.到Adobe官网下载FlashBuilder 4.6, ...
- 怎么样把计算机桌面的图标改小,怎样将电脑桌面图标变小_三招搞定桌面图标太小问题-系统城...
电脑安装win10系统后发现桌面的图标太大,想要把这些图标变小,这要怎么操作?由于对操作界面都不熟悉,所以不懂怎么设置,别担忧,小编今天就来分享一种将电脑桌面图标变小的方法,感兴趣的快来试试. 具体方 ...
- windows+mysql集群搭建-三分钟搞定集群
一.集群了解 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一个库dang了,不会影响程序的运行.首先看了一些关于集群的资料,然后根据步骤一步步的整,遇到了一些问题,在这里把我遇到的问题以及解 ...
最新文章
- python joblib库 并行化 缓存
- Oracle Advanced Security:Column Encryption Overhead
- Android启动过程深入解析
- GDCM:DICOM转储到DshibaDTI的测试程序
- python hashlib 哈希算法
- 微计算机和微处理器的区别,CPU和微处理器的区别
- 如何写出安全的API接口
- [vue] 你期待vue3.0有什么功能或者改进的地方?
- [HNOI2004]L语言
- 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
- 【BZOJ1226】学校食堂(动态规划,状态压缩)
- java中substring的使用方法
- SQLSERVER 清除链接历史记录
- elastix中NAT穿越问题解决办法
- #_1 Win10原版镜像安装教程 + 系统崩溃备份文件
- 2022年自考专业考试(计算机应用)离散数学模拟冲刺题
- Android studio 打包 uni App 修改apk名称,app名称及图标
- 国际象棋渲染测试软件,测试了五款软件八款游戏:AMD三代锐龙YES!但游戏英特尔略胜一筹...
- html数独游戏源代码,数独游戏求解程序(附源代码)
- 如何利用家庭闲置宽带赚钱,甜糖 x86 docker 从零开始搭建
热门文章
- 浅谈clientX、offsetX、screenX、pageX
- touch.pageX/touch.screenX/touch.clientX的区别
- 图像处理之图像的像素运算
- 凯盛融英在港招股书“失效”:遭证监会严格发问,需补充披露
- PostGIS搭建、空间数据库创建
- NTL密码算法开源库-大整数ZZ类(一)
- Mac取证你需要了解的那些事!
- 信号完整性(SI)电源完整性(PI)学习笔记(二十六)S参数在信号完整性中的应用(一)
- 通过HbuilderX启动 微信开发者工具
- php ci hooks,CodeIgniter框架钩子机制实现方法【hooks类】