三页搞定GB2818/SIP/RTP、PS封装

(2016-08-23 18:27:20)

转载

标签:

it

互联网

gb28181

sip

rtp

分类: 技术

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封装相关推荐

  1. android 图片墙拼贴,三步搞定 用APP打造图片文字拼贴效果

    相信大家一定见过一种文字拼贴效果的图片,许多大小不一.字体不同.颜色各异的文字拼合出一幅完整的画面.如果你曾经也想自己制作这么一张高端大气上档次的独特图片,却苦于自己的PS水平不到家,那么一定不要错过 ...

  2. EasyExcel 三分钟搞定导入导出

    前言:本文章教你从零开始,三分钟搞定excel单sheet导出.导入.多sheet导出.导入.excel模板导入单个sheet.多个sheet,废话不多说,直接上代码 1.引入依赖 <!--ex ...

  3. 三分钟搞定一个网页原型设计

    三分钟搞定一个网页原型设计 PS插件之Velositey(撒福利一波吼~) 做设计的大佬们应该很熟这个插件了,主要安利给平时不玩设计的后台们,以及不想花时间在做重复框架上的同学,更多的时间快留给打磨属 ...

  4. Flash Builder4.7极其简单破解方法-三步搞定(亲测)

    资讯类型: 转载 来源页面: http://weibo.com/2101024913/yvmR0D9Df 资讯原标题: 资讯原作者: 丿卓越丶星辰 翻译词数: 词 我的评论: 对这篇文你有啥看法,跟贴 ...

  5. 服务器添加管理员隐藏账号,绝招:隐藏管理员账号 三分钟搞定

    绝招:隐藏管理员账号 三分钟搞定 更新时间:2007年07月30日 11:30:59   作者: 对regedit.exe大家都很熟悉,但却不能对注册表的项键设置权限,而regedt32.exe最大的 ...

  6. linux 无法定位程序,三步搞定无法定位程序输入点 于动态链接库上

    三步搞定无法定位程序输入点 于动态链接库上 发布时间:2018-09-17 09:24 来源:互联网 当前栏目:电脑教程 上网的时候突然咚的一声弹出一个错误提示框,上边写着 iexplore.exe ...

  7. Flash Builder4.7极其简单破解方法-三步搞定

    Flash Builder4.7极其简单破解方法-三步搞定(亲测) 原方法适用于4.6版本,同样方法4.7完美破解,不敢独享 具体步骤如下: 1.到Adobe官网下载FlashBuilder 4.6, ...

  8. 怎么样把计算机桌面的图标改小,怎样将电脑桌面图标变小_三招搞定桌面图标太小问题-系统城...

    电脑安装win10系统后发现桌面的图标太大,想要把这些图标变小,这要怎么操作?由于对操作界面都不熟悉,所以不懂怎么设置,别担忧,小编今天就来分享一种将电脑桌面图标变小的方法,感兴趣的快来试试. 具体方 ...

  9. windows+mysql集群搭建-三分钟搞定集群

    一.集群了解 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一个库dang了,不会影响程序的运行.首先看了一些关于集群的资料,然后根据步骤一步步的整,遇到了一些问题,在这里把我遇到的问题以及解 ...

最新文章

  1. python joblib库 并行化 缓存
  2. Oracle Advanced Security:Column Encryption Overhead
  3. Android启动过程深入解析
  4. GDCM:DICOM转储到DshibaDTI的测试程序
  5. python hashlib 哈希算法
  6. 微计算机和微处理器的区别,CPU和微处理器的区别
  7. 如何写出安全的API接口
  8. [vue] 你期待vue3.0有什么功能或者改进的地方?
  9. [HNOI2004]L语言
  10. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
  11. 【BZOJ1226】学校食堂(动态规划,状态压缩)
  12. java中substring的使用方法
  13. SQLSERVER 清除链接历史记录
  14. elastix中NAT穿越问题解决办法
  15. #_1 Win10原版镜像安装教程 + 系统崩溃备份文件
  16. 2022年自考专业考试(计算机应用)离散数学模拟冲刺题
  17. Android studio 打包 uni App 修改apk名称,app名称及图标
  18. 国际象棋渲染测试软件,测试了五款软件八款游戏:AMD三代锐龙YES!但游戏英特尔略胜一筹...
  19. html数独游戏源代码,数独游戏求解程序(附源代码)
  20. 如何利用家庭闲置宽带赚钱,甜糖 x86 docker 从零开始搭建

热门文章

  1. 浅谈clientX、offsetX、screenX、pageX
  2. touch.pageX/touch.screenX/touch.clientX的区别
  3. 图像处理之图像的像素运算
  4. 凯盛融英在港招股书“失效”:遭证监会严格发问,需补充披露
  5. PostGIS搭建、空间数据库创建
  6. NTL密码算法开源库-大整数ZZ类(一)
  7. Mac取证你需要了解的那些事!
  8. 信号完整性(SI)电源完整性(PI)学习笔记(二十六)S参数在信号完整性中的应用(一)
  9. 通过HbuilderX启动 微信开发者工具
  10. php ci hooks,CodeIgniter框架钩子机制实现方法【hooks类】