RTP分析

2023-05-16

参考

RTP(A Transport Protocol for Real-Time Applications–实时传输协议,rfc3550)
RTP Payload Format for H.264 Video(rfc6184)
https://en.wikipedia.org/wiki/Real-time_Transport_Protocol
RTP包组成:
image.png

头部

RTP头部最小12字节(没有CSRC没有扩展头部)
image.png

  • V (Version): (2位) RTP协议版本号,rfc3550规定是2。
  • P (Padding): (1位) 如果设置了padding位,则数据包的末尾包含一个或多个额外的填充字节(八位),它们不是有效负载的一部分。填充的最后一个八位字节包含应忽略的字节数,包括其本身。某些具有固定块大小的加密算法或在较低层协议数据单元中承载多个RTP数据包可能需要填充。
  • X (Extension): (1位) 如果设置了扩展位,则RTP头部后面必须紧跟一个扩展头部,格式见第5.3.1节。
  • CC (CSRC count): (4位) 表示SSRC后面的CSRC数量。
  • M (Marker): (1位) 标记一帧的结束,由负载类型决定含义。当多个RTP包携带1帧数据时,前面的RTP包的marker标志设置为0,最后一个RTP包marker标志设置为1。
  • PT (Payload type): (7位) 表示RTP负载类型。可以被动态赋值,例如在RTSP的Describe响应的SDP媒体描述中包含a=rtpmap:96 H264/90000行,表明RTP负载类型96对应的是H264。
  • Sequence number: (16位) RTP包的序列号,每发送一个RTP包,序列号加1。接收器可使用序列号检测数据包丢失并恢复数据包序列。序列号的初始值应该是随机的(不可预测的),以使对加密的已知明文攻击更加困难。RTSP PLAY响应包括序列号和时间戳的初始值。
  • Timestamp: (32位) 时间戳反映RTP数据包中第一个八位字节的采样瞬间。时间戳的初始值应该是随机的。RTP时间戳在RTP同步中是非常重要的,它确保接收方能够以正确的速率和顺序播放媒体数据,并保持与发送方的同步。
  • SSRC: (32位) 同步源标识符。应随机选择该标识符,确保同一个RTP会话的两个同步源(音频流和视频流)不会有相同的SSRC标识符。
  • CSRC: (32位) 可选的,当CC大于0存在该字段。用于标识当前RTP数据包中参与数据生成和发送的所有同步源(标识参与当前媒体数据采集、编码或发送的所有同步源)。它可以帮助接收方进行同步和混音,并提高RTP流的安全性和可靠性。CSRC的数量由CC字段表示。在一个RTP会话中,每个RTP数据包可以包含多个CSRC值,最多可以包含15个。
  • Header extension: 可选的,当设置了扩展标志位,存在该扩展头部。第一个32位包括配置文件特定的标识符(16位)和长度标识符。

image.png

H.264的RTP负载格式

对于单个NALU和非交错分组模式,序列号用于确定NALU的解码顺序。
RTP时间戳设置为内容的采样时间戳。必须使用90 kHz的时钟频率。

负载结构有三种,根据RTP负载的第一个字节的后5位来判断

  1. Single NAL Unit Packet(单个NAL单元数据包)
  2. Aggregation Packet(聚合数据包)
  3. Fragmentation Unit(分片单元)

Single NAL Unit Packet即1个RTP包承载1个NALU
Aggregation Packet即1个RTP包承载多个NALU
Fragmentation Unit即多个RTP包承载1个NALU(例如1个IDR帧很大,需要分成多个RTP包)
image.png

RTP包负载的第一个字节

forbidden_zero_bit

占1位,禁止位,H.264规定为0。rfc6184规定为1时表示NALU有比特错误或者语法错误。

nal_ref_idc

占2位,表示该NALU的重要程度。SPS,PPS,IDR不应该为0,值越大越重要。为0表示该NALU不用来重建参考图像,可能会被某些解码器丢弃。

nal_unit_type

占5位,指定了NALU单元的数据类型。1-23是Single NAL Unit Packet,24-27是Aggregation Packet,28-29是Fragmentation Unit。
image.png
其中NAL unit和FU-A最常见。

Single NAL Unit Packet(单NAL单元数据包)

image.png

FU-A分片

image.png

FU indicator

FU indicator字节的格式如下:
image.png
Type字段中等于28和29的值分别表示FU-A和FU-B。

FU header

FU header具有以下格式:
image.png
S:1位,起始位。设置为1时表示分片NAL单元的开始。
E:1位,结束位。设置为1时表示分片NAL单元的结束。
R:1位,保留位。必须等于0,并且必须被接收者忽略。
Type:5位,NAL单元负载类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTP分析 的相关文章

  • rtp载荷H264解包过程分析,ffmpeg解码qt展示

    网络抽象层单元 NALU NALU头 NALU 头 由1个byte组成 它的语法如下 43 43 0 1 2 3 4 5 6 7 43 43 43 43 43 43 43 43 43 F NRI Type 43 43 F 1 个比特 for
  • rtp载荷H264解包过程分析,ffmpeg解码qt展示

    网络抽象层单元 NALU NALU头 NALU 头 由1个byte组成 它的语法如下 43 43 0 1 2 3 4 5 6 7 43 43 43 43 43 43 43 43 43 F NRI Type 43 43 F 1 个比特 for
  • H264码流RTP封装方式详解

    H264码流RTP封装方式详解 文章目录 H264码流RTP封装方式详解 1 H264基本概念 2 NALU Header介绍 3 RTP封装H264码流 3 1 单一NALU模式 3 2 组合帧封装模式 3 3 分片封装模式 4 代码解析
  • H.264 RTSP 绝对时间戳

    是否可以从安讯士摄像机通过 RTSP 发送的 H 264 流中读取绝对时间戳 有必要知道相机何时拍摄该帧 谢谢 安德里亚 正如拉尔夫已经说过的 RTP 时间戳与随机时钟相关 它们仅用于计算两个帧 或一般的 RTP 数据包 之间的差异 为了将
  • H264 NAL 单元前缀

    我需要对 H264 NAL 单位分隔符前缀进行一些澄清 00 00 00 01 and 00 00 01 我正在使用 Intel Media SDK 生成 H264 并将其打包到 RTP 中 问题是到目前为止我只是在寻找00 00 00 0
  • 使用 FFMPEG 从 IP 摄像机读取 RTCP 数据包

    我正在使用 ffmpeg C 库 我需要拦截来自摄像头的 RTCP 数据包 以便从发送者报告中获取时间戳 ffmpeg 中是否有任何方法或结构可以为我提供此信息 我完全陷入困境 但我无法解决这个问题 任何帮助将不胜感激 提前致谢 最后我不得
  • 通过 rtp 流发送 Android h264 捕获

    我正在为 android 编写一个 rtp 视频流媒体 它从 Android 本地套接字读取 h264 编码数据并将其打包 问题是我做到了 但我在客户端 Voip 不断收到黑框 通信过程如下 Android gt Asterisk gt J
  • 编写自定义 DirectShow RTSP/RTP 源推送过滤器 - 来自实时源的时间戳数据

    我正在编写自定义 DirectShow 源推送过滤器 该过滤器应该从视频服务器接收 RTP 数据并将它们推送到渲染器 我编写了一个 CVideoPushPin 类 它继承自 CSourceStream 和 CVideoReceiverThr
  • 在 libav 中读取 dumepd RTP 流

    嗨 我需要一些帮助 指导 因为我陷入了我的研究之中 问题 如何在 API 通过编程 或控制台版本中使用 gstreamer 或 avlib ffmpeg 转换 RTP 数据 Data 我有来自 TCP 上的 RTP RTCP 的 RTP 转
  • RTSP RTP 客户端流、时间戳、live555

    我有一个位于不同国家 地区的网络摄像机 具有不同的时区 并且应用了它自己的日期时间值 例如 2012 04 16 11 30 00 然后是我的电脑所在的位置 例如我的电脑时间是 2012 14 16 06 10 00 我的目的 流式传输时
  • 无法在 Samsung Galaxy S2 的 VideoView 中播放 RTSP 视频

    我正在尝试播放实时 RTSP 视频 来自rtsp media2 tripsmarter com LiveTV BTV using VideoView 这是我的代码 public class ViewTheVideo extends Acti
  • 从 QuickTime MOV 文件解析 h.264 NAL 单元

    我正在尝试从 iPhone 上的 MOV 文件获取 h 264 NAL 单位 以便将 RTP h 264 视频从 iPhone 摄像头传输到服务器 Apple 的 API 不允许直接访问来自相机输出的编码比特流 因此我只能在写入 MOV 文
  • 我可以使用WebRTC接收标准RTP视频流吗?

    我有两台计算机在同一网络上 其中一个使用 RTP 协议传输电影 H264 是否可以创建一个简单的 JavaScript 应用程序来在第二台计算机上接收此流并显示在视频标签中 到目前为止 我对WebRTC的印象是它被设计为在浏览器之间使用 都
  • H.264 over RTP - 识别 SPS 和 PPS 帧

    我有来自 IP 摄像机的原始 H 264 流 封装在 RTP 帧中 我想将原始 H 264 数据放入文件中 以便我可以将其转换为ffmpeg 因此 当我想将数据写入原始 H 264 文件时 我发现它必须如下所示 00 00 01 SPS 0
  • 如何将 rtp 数据包有效负载字节转换为任何音频数据?

    我正在用java制作一个项目 不使用任何第三方库 我已经使用以下命令成功建立了 udp 连接DatagramSocket 然后我开始使用sip协议进行通信 我已经顺利通过了注册和邀请阶段 这就是我获取音频数据流将传输到的主机和端口的方式 然
  • libavformat/ffmpeg 与 x264 和 RTP 同步时出现问题

    我一直在开发一些实时直播的流媒体软件 来自各种摄像机和网络流使用 H 264 为了实现这一点 我直接使用 x264 编码器 使用 零延迟 预设 并提供 NAL 因为它们可用于 libavformat 打包到 RTP 最终是 RTSP 中 理
  • FFmpeg RTP 流媒体错误 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想通过 FFmpeg 播放视频文件 但出现此错误 RTP 复用器仅支持一种流 当我写这个时 我得到了这个错误 ffmpeg exe i SomeVi
  • 适用于 iPhone 和 Android 的 sip 堆栈

    我正在寻找适用于 Android 和 iPhone 的 SIP 堆栈 我发现了很多类似的问题 有时已经很老了 我不太关心解决方案是商业的 但这是首选 还是开源的 到目前为止我发现 RADVISION 的 Android 商业解决方案 iPh
  • 用于实时传输协议的开源 .net C# 库

    net中有好的RTP开源库吗 我的目的是用于音频和视频同步问题并提高每秒帧数速率 我对 RTP 不太了解 但你可能想看看本文 http www codeproject com KB IP Using RTP in Multicasting
  • 将视频输入流转换为 RTMP

    我想将 Android 手机中的视频录制流式传输到网络媒体服务器 第一个问题是设置时MediaRecorder输出到套接字 流丢失了一些mdat大小标题 这可以通过在本地预处理流并将丢失的数据添加到流中以生成有效的输出流来解决 问题是如何从

随机推荐

  • grafana接入openldap认证

    首先两个文件开启ldap的支持 文件1 xff1a etc grafana grafana ini auth ldap enabled 61 true config file 61 etc grafana ldap toml allow s
  • Wireshark的常见提示

    概述 本文主要介绍Wireshark中出现的一些常见提示 详细信息 Wireshark简介 Gerald Combs是堪萨斯城密苏里大学计算机科学专业的毕业生 1998年发布了第一版Ethereal工具 xff0c Ethereal工具使用
  • shell报错bad substitution 解决办法

    bin bash a 61 34 hello 34 b 61 34 hi is a 34 echo b echo a echo a echo a 1 2 执行脚本方式不同出现的结果不同 xff1a 方式1 xff1a sh shell sh
  • centos8软件安装dnf命令

    DNF是新一代的rpm软件包管理器 它首先出现在 Fedora 18 这个发行版中 而目前 xff0c 它取代了yum xff0c 正式成为从 Fedora 22 起 Fedora 版本的包管理器 DNF包管理器克服了YUM包管理器的一些瓶
  • 多目标规则在 Makefile 中的应用与示例

    在 Makefile 中 xff0c 如果一个规则有多个目标 xff0c 而且它们之间用空格分隔 xff0c 我们称之为 34 多目标规则 34 这意味着这个规则适用于列出的所有目标 在目标下面的命令是 C 64 xff0c 它通常与 ma
  • 计算机中内存、cache和寄存器之间的关系及区别

    1 寄存器是中央处理器内的组成部份 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和位址 在中央处理器的控制部件中 xff0c 包含的寄存器有指令寄存器 IR 和程序计数器 PC 在中央处理器的算术及逻辑部件中 x
  • dell 台式电脑设置每天定时开机和关机

    每天定时开机设置 xff1a 戴尔电脑通过CMOS设置实现自动开机的设置过程如下 xff1a 1 首先进入 CMOS SETUP 程序 大多数主板是在计算机启动时按DEL或F2键进入 xff1b 2 然后将光条移到 Power Manage
  • windows批处理自动获取电脑配置信息

    39 2 gt nul 3 gt nul amp cls amp 64 echo off 39 amp rem 获取本机系统及硬件配置信息 39 amp set 61 Any question amp set 64 61 WX amp se
  • Centos7搭建cisco ocserv

    一 安装的部分直接yum安装即可 yum y install ocserv 二 配置文件根据实际情况调整 auth方式有两种 1 系统账号认证 配置的话就是 xff1a auth 61 34 pam 34 2 本地文件认证 配置的话就是 x
  • 私有harbor部署(docker方式)

    环境准备 docker compose v Docker Compose version v2 14 2 wget https github com docker compose releases download v2 14 2 dock
  • ORACLE扩展表空间

    一 查询表空间使用情况 SELECT UPPER F TABLESPACE NAME 34 表空间名 34 D TOT GROOTTE MB 34 表空间大小 M 34 D TOT GROOTTE MB F TOTAL BYTES 34 已
  • Oracle 常用性能监控SQL语句

    1 查看表锁 SELECT FROM SYS V SQLAREA WHERE DISK READS gt 100 2 监控事例的等待 SELECT EVENT SUM DECODE WAIT TIME 0 0 1 34 Prev 34 SU
  • Nginx出现“ 413 (499 502 404) Request Entity Too Large”错误解决方法

    1 Nginx413错误的排查 修改上传文件大小限制 在使用上传POST一段数据时 xff0c 被提示413 Request Entity Too Large xff0c 应该是nginx限制了上传数据的大小 解决方法就是 打开nginx主
  • 查看弹出广告来自哪个软件

    打开VS的Spy 43 43 将指针移到广告处 xff0c 然后点OK xff0c 在Process标签页可以看到进程id和线程id将获得的16进制进程id xff08 例如 xff1a 000025F8 xff09 通过计算器转成10进制
  • C++多态虚函数实现原理,对象和虚函数表的内存布局

    基本概念 我们知道C 43 43 动态多态是用虚函数实现的 xff0c 而虚函数的实现方式虽说C 43 43 标准没有要求 xff0c 但是基本都是用虚函数表实现的 xff08 编译器决定 xff09 所以我们有必要了解一下虚函数表的实现原
  • C++ STL中递归锁与普通锁的区别

    在多线程编程中 xff0c 保护共享资源的访问很重要 xff0c 为了实现这个目标 xff0c C 43 43 标准库 xff08 STL xff09 中提供了多种锁 xff0c 如std mutex和std recursive mutex
  • VS+Qt开发环境

    VS Qt下载 VS下载 xff1a https visualstudio microsoft com zh hans vs Qt下载安装 xff1a https www bilibili com video BV1gx4y1M7cM VS
  • windows下使用ShiftMediaProject编译调试FFmpeg

    为什么要编译FFmpeg xff1f 定制模块调试源码 windows下编译 推荐项目ShiftMediaProject FFmpeg 平时总是看到一些人说windows下编译FFmpeg很麻烦 xff0c 这时候我就都是微微一笑 xff0
  • RTSP分析

    RTSP使用TCP来发送控制命令 xff08 OPTIONS DESCRIBE SETUP PLAY xff09 xff0c 因为TCP提供可靠有序的数据传输 xff0c 而且TCP还提供错误检测和纠正 RTSP的报文格式可以参考HTTP的
  • RTP分析

    参考 RTP xff08 A Transport Protocol for Real Time Applications 实时传输协议 xff0c rfc3550 xff09 RTP Payload Format for H 264 Vid