服务器端的sendto

  1. 首先要得到客户端的IP地址和端口号
struct sockaddr_in server;server.sin_family=AF_INET;server.sin_port=htons(g_rtspClients[is].rtpport[0]);    // htons 转换为网络序      server.sin_addr.s_addr=inet_addr(g_rtspClients[is].IP);
  1. 计算出RTP timestamp,RTP timestamp表示每帧的时间,也同样是每帧之间时间间隔。

    两帧之间RTP timestamp的增量 = 时钟频率 / 帧率

    其中时钟频率可从SDP中获取(在描述DESCRIBE中),如:
    m=video 2834 RTP/AVP 96
    a=rtpmap:96 H264/90000

    其时钟频率为90000(通常视频的时钟频率),若视频帧率为25fps,则相邻帧间RTP timestamp增量值 = 90000/25 = 3600。

    另外,通常音频的时钟频率一般为8000

注意:帧率要按照自己的帧率做修改;

  1. rtp_hdr RTP头
  rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0]; rtp_hdr->payload     = RTP_H264;    // 类型rtp_hdr->version     = 2;     // rtp的版本号      rtp_hdr->marker    = 0;      // 当前包是不是最后一包的标志         rtp_hdr->ssrc      = htonl(10);  // 信源标记

这里的数组sendbuf[0] 数组首地址定义一个RTP_FIXED_HEADER*指针类型;
这个RTP_FIXED_HEADER结构体中的参数占用0~11个字节;这样一来下面的FU indicator就要从第12个字节地址开始了。

  1. 分包
    h264包在传输的时候,如果包太大,会被分成多个片。NALU头会被如下的2个自己代替。
    The FU indicator octet has the following format:
    ±--------------+
    |0|1|2|3|4|5|6|7|
    ±±±±±±±±+
    |F|NRI| Type |
    ±--------------+
    别被名字吓到这个格式就是上面提到的RTP h264负载类型,Type为FU-A
    为I帧NRI=1;非I帧RI=0; 为1的时候会代表受重视的成都要高。
    The FU header has the following format:
    ±--------------+
    |0|1|2|3|4|5|6|7|
    ±±±±±±±±+
    |S|E|R| Type |
    ±--------------+
    S bit为1表示分片的NAL开始,当它为1时,E不能为1
    E bit为1表示结束,当它为1,S不能为1
    R bit保留位
    Type就是NALU头中的Type,取1-23的那个值

  2. 当一帧被分包发送的时候,NALU头会被如下的2个自己代替:FU indicatorFU header。这两个各位1个字节;

     fu_ind =(FU_INDICATOR*)&sendbuf[12]; // 数组指针地址定位到数组12的位置fu_ind->F= 0;     // 由上面4.分包可以查看这些参数的位数fu_ind->NRI= nIsIFrm;     // 为I帧NRI=1;非I帧RI=0;fu_ind->TYPE=28;       // FU-A 分片的单元 查看NALU 可以理解fu_hdr =(FU_HEADER*)&sendbuf[13];fu_hdr->E=0;fu_hdr->R=0;fu_hdr->S=1;fu_hdr->TYPE=nNaluType;

具体可参考本站介绍
https://blog.csdn.net/weixin_40673765/article/details/99583789

rtsp中的rtp发送和head理解相关推荐

  1. RTSP中TS流结构分析

    RTSP中TS流结构分析 UDP数据包整体结构 RTP Header结构 TS Header结构 PAT结构 PMT结构 PES Header结构 ES层 Wireshark抓取TS包 UDP数据包整 ...

  2. H264 NALU 使用PS封装 RTP发送

    最近由于项目平台需求,要将H264 NALU封装为PS再用RTP发送,PS封装按照ISO DEC-13818-1标准.一个PS包包含PS Header, PES Header, PS system h ...

  3. rtp发送 h265

    自己写的select 做TCP服务端,把tcp数据按照RTSP协议解析,掉函数直接获取一帧音频,一帧视频这种,分包成RTP发送 用ffmpeg 转载于:https://www.cnblogs.com/ ...

  4. nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园

    nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的: http://host[:port][path] h ...

  5. 第三季2:ORTP库的源码分析、RTP发送实验的源码分析

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 一.ORTP库源码分析 1.ORTP库概览 (1)库提供一堆功能函数(本身没有main),都在src目录下 (2)库的使用给了案例(有main),在sr ...

  6. php ob 缓存,php中ob函数缓冲机制深入理解

    下面就php中ob函数缓冲机制通过文字说明加代码分析的形式给大家展示如下: 对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会'嗖 ...

  7. RTP发送和接收(有图为证)

    RTP协议接收和播放 前面讲过RTP协议的重要性,说过发送RTP协议,RTP协议重要性下面我们开始写发送和接收程序,不依赖于jrtplib等RTP库,自行接收.这样,有利于以后将RTP直接转到Webr ...

  8. IGRP中的RTP、Neighbor Discovery协议及Time总结

    EIGRP的运行所需要的四个组件包括: 1.Protocol-Dependent Modules(负责针对各种特定协议,如IP.IPX.APPLETALK) 2.RTP(Reliable Transp ...

  9. 前端中DOM是什么,怎样理解dom

    前端中DOM是什么,怎样理解? 首先我们来说一下DOM是什么? 文档对象模型(Document Object Model,简称DOM).我个人认为他就是将,通过浏览器的一些规则解析后,在渲染成我们能够 ...

最新文章

  1. linux6.5安装打印机,如何在CentOS 6.5下安装Win7下的共享打印机服务
  2. cglib动态代理和jdk动态代理的区别与应用
  3. Java 源码赏析 - java.lang - Void
  4. 【bzoj3224】普通平衡树——treap
  5. 【AI视野·今日CV 计算机视觉论文速览 第197期】Thu, 13 May 2021
  6. ubuntu14.04如何安装teamviewer
  7. C程序设计语言现代方法15:编写大型程序
  8. HYSPLIT模型后向轨迹制作
  9. 三国论(16-20章)
  10. 网吧里电脑提示计算机内存不足,网吧电脑显示虚拟内存不足该怎么办呢
  11. Apache Spark源码阅读环境搭建
  12. 如何调教ChatGPT
  13. BI神器Power Query(20)-- PQ自适应目录
  14. HyperLynx(三十一)高速串行总线仿真(三)
  15. echarts 散点图实现正负值颜色不同,方向不同
  16. sudo,su, -的区别
  17. 交友盲盒源码h5开发浅谈
  18. 【SHOI 2002】百事世界杯之旅 (BSOI4841)
  19. CMS和G1的对比分析
  20. 华为ddm的datax的bug

热门文章

  1. 何恺明团队新作:只用普通ViT,不做分层设计也能搞定目标检测
  2. OpenAI开放GPT-3微调功能,一行命令就能实现!正确率最高提升4倍
  3. Pytorch翻车记录:单卡改多卡踩坑记!
  4. 自建28核树莓派集群,顺便学学docker,这里有一个500美元的搭建方案
  5. 大写的服!中科大博士20万字论文:如何给女朋友送礼物
  6. 94年出生,如今985高校博士生导师!
  7. VRRP的虚拟MAC地址高位为
  8. 计算机专业专业课的准备
  9. 实战 | 多种方法实现以图搜图
  10. 百度不到的硬核资源,8h删,抓紧收藏!