RTP协议与实战

RTP协议与实战一.前言二.RTP协议三.使用jrtplib发送RTP数据包

大家好,又见面了,我是你们的朋友全栈君。

一. RTP协议

        在实时音视频通话中,我们通常使用 UDP 作为传输层协议,使用 RTP 协议包荷载音视频数据,RTP(Real-time Transport Protocol)是一种在 Internet 上传输多媒体数据的应用层协议,它通常建立在 UDP 之上(也可以建立在 TCP 上)。UDP 协议没有序号等信息,而 RTP 协议可以补充许多音视频传输必要的信息,让音视频数据到达对端后可以重新组合完整,RTP 本身只保证实时数据的传输,并不能提供可靠传输保证,也没有流量控制,拥塞控制机制,它通常与 RTCP 配合使用以提供这些服务。

        RTP 协议格式如下,红色部分为 RTP 协议可选字段,RTP 协议最小为 12 byte。

RTP协议与实战

Version:RTP 协议版本号

P:填充标识,如果该位为 1,说明该 RTP 包末尾包含了一个或多个填充字节,最后一个字节的值表示填充的字节数(包含最后一个字节本身),一般在一些需要固定块大小的加密算法中才需要填充

X:扩展标识,如果该位为 1,说明有扩展头部信息(Extension header)

CC:CSRC Count,共享媒体源个数,一般用于混音和混屏中,例如某个音频流是混合了其它音频后的数据,那么其它音频源就是该音频源的 CSRC

M:Mark 标记位,对于不同的负载类型有不同含义,例如使用 RTP 荷载 H264 码流时,可以用该位标记是否为 NALU 的最后一个包

PT:Payload Type,负载包类型,接收端可以根据该信息查找相应的解码器进行解码,Payload Type 值对应的编解码类型参考该文档

Sequence number:序列号,每个 RTP 包序号递增加一,接收端根据序列号可以判断传输是否丢包,序列号初始值是随机的

Timestamp:相对时间戳信息,反映 RTP 数据包数据采样时间,一个帧的数据可能被分成多个 RTP 包发送,同一个帧的时间戳是相同的,不同帧的时间戳是不相同的,该值初始值是随机的,单位的含义与数据采样频率有关

SSRC:媒体源的标识,不同的 SSRC 标识不同的媒体源,例如不同用户的音频就属于不同的媒体源,具有不同的 SSRC

CSRC identifiers:共享媒体源列表,表示对 RTP 包内载荷起作用的媒体源,参见 CC 解释,CSRC 最多 15 个

Profile:RTP 扩展头部有两种类型,one-byte header 和 two-byte header,当 Profile = 0xBEDE 时表示使用 one-byte header,Profile = 0x1000 时表示使用 two-byte header,扩展头部个数由 Extension header length 决定

Extension header length:表示后面的 Extension header 共有几个字节,长度以 4 字节为单位,例如 length = 3 表示 Extension header 一共占 3*4=12 个字节

Extension header:具体的扩展头部,由 ID,L,data 组成,可以是 one-byte header 或者 two-byte header 组织方式

        one-byte header  格式如下,它由 ID,L,data 三部分组成。ID 和 L 分别占 4 bit,加起来等于 one-byte,ID 表示扩展头部 ID 标记,L 表示 extension data 所占字节数 -1,例如 L = 0 时实际 data 占一个字节,由于头部需要按 4 字节对齐,因此中间补充了 padding 数据,最后一个 extension header data 占 4 字节。

RTP协议与实战

        two-byte header 格式如下,它也是由 ID, L, data 三部分组成,不同之处在于 two-byte header 中 ID,L 各占一字节,而 L 表示 extension data 所占的字节数(不同于 one-byte header 需要减一)。

RTP协议与实战

        常见的 header extension ID 类型如下,关于具体某个扩展头部的含义可以参考 RFC 或者 webrtc 文档。

enum RTPExtensionType : int {
  kRtpExtensionNone,
  kRtpExtensionTransmissionTimeOffset,
  kRtpExtensionAudioLevel,
  kRtpExtensionInbandComfortNoise,
  kRtpExtensionAbsoluteSendTime,
  kRtpExtensionAbsoluteCaptureTime,
  kRtpExtensionVideoRotation,
  kRtpExtensionTransportSequenceNumber,
  kRtpExtensionTransportSequenceNumber02,
  kRtpExtensionPlayoutDelay,
  kRtpExtensionVideoContentType,
  kRtpExtensionVideoTiming,
  kRtpExtensionFrameMarking,
  kRtpExtensionRtpStreamId,
  kRtpExtensionRepairedRtpStreamId,
  kRtpExtensionMid,
  kRtpExtensionGenericFrameDescriptor00,
  kRtpExtensionGenericFrameDescriptor = kRtpExtensionGenericFrameDescriptor00,
  kRtpExtensionGenericFrameDescriptor02,
  kRtpExtensionColorSpace,
  kRtpExtensionNumberOfExtensions  // Must be the last entity in the enum.
};

        如下是 Wireshark 抓取某路流的一个 RTP 数据包。

RTP协议与实战

二. 实战

使用JRTPLIB发送/接收RTP数据包

使用RTP包荷载H264码流

RTP扩展头部Audio Level的应用(mediasoup显示当前通话Speaker)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153980.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL 索引概览

    MySQL 索引概览前言在SQL优化中,索引是至关重要的一环,能给查询效率带来质的飞跃,但是索引并不是万能的,不合理的索引设计甚至会拖慢查询效率。本文将详细介绍各类索引的定义、用法以及分类,并讨论使用索引时应该权衡的要素。文章目录前言概览索引定义索引优缺点优点缺点索引类型按功能逻辑划分普通索引唯一索引主键索引全文索引按物理实现划分聚集索引(clusteredindex)非聚集索引(non-clusteredindex)按字段个数划分单一索引组合索引最左匹配原则概览索引定义索引是一种专门用于帮助SQL高效获

    2022年6月24日
  • 中小型酒店管理系统[通俗易懂]

    中小型酒店管理系统[通俗易懂][摘要]计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量。优秀的中小型酒店管理系统能够更有效管理用户预订酒店业务规范,帮助管理者更加有效管理用户预订酒店,可以帮助提高克服人工管理带来的错误等不利因素。所以一个优秀的中小型酒店管理系统能够带来很大的作用。本中小型酒店管理系统使用了计算机语言Java和存放数据的仓库MySQl,采用了MVC设计模式来实现。本系统使用了框架SpringBoot实现了中小型酒店管理系统应有的功能,系统主要角色包括管理员、第三方管理员和酒店管理员。[关键词]

    2022年9月25日
  • pycharm使用anaconda虚拟环境_conda和anaconda

    pycharm使用anaconda虚拟环境_conda和anacondapycharm加载anconda创建的虚拟环境一、环境​ 1、虚拟环境为xy01,python版本为3.7。二、流程​ 1、首先点击pycharm左上方File->settings,得到如下界面,再点击右上方红框,再点击add。​ 2、得到如下界面,点击左边的condaenvironment,选择existingenvironment,再选择创建的虚拟环境,最后点击OK,则pycharm已经加载新创建的conda虚拟环境。…

    2022年8月27日
  • android viewpager实现轮播「建议收藏」

    android viewpager实现轮播「建议收藏」本文是基于ViewPager实现的无限自动轮播banner分为三步:第一部分是有限手动轮播;第二部分是无限轮播;第三部分是自动轮播;第四部分是指示器适配有限手动轮播实现:布局:<androidx.viewpager.widget.ViewPagerandroid:id=”@+id/banner”android:layout_width=”match_parent”android:layout_height=”wrap_content”andro

    2022年7月22日
  • JVM优化[通俗易懂]

    JVM优化[通俗易懂]为什么要进行JVM优化?在本地开发环境中我们很少有需求对JVM进行优化,但是到了生产环境我们的程序可能出现如下问题:运行的引用“卡住了”,日志不输出,程序没反应服务器的CPU负载突然升高在多线程应用下,如何合理的分配线程的数量。。。。。。。。。通过Java-server和java-client设置JVM的运行参数serverVM的初始堆空间会大一些,默认使用的是并行垃圾回…

    2022年4月28日
  • sqlserver2012安装教程win10_sql2017安装教程图解

    sqlserver2012安装教程win10_sql2017安装教程图解推荐使用msdn我告诉你网站进行下载,SQLServer2012下载地址先选择服务器如何选择SQLServer2012选择自己要的版本,如果32位机器找x86的版本,如果是64位的请选择x64版本。安装好进入,系统会自动加载ios,找到安装程序,双击打开选择安装然后选择全新的sqlserver独立安装选择安装然后选择全新的sqlserver独立安装…

    2022年8月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号