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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CSS美化超链接样式

    CSS美化超链接样式美化超链接样式一、使用动态伪类注意!!!超链接的四种状态样式的排列是固定的,一般不能随意调换正确的顺序时Link,visited,hover,active当鼠标经过超链接是,会先执行第一行声明,但是紧接着第三行声明会覆盖掉第一行和第二行声明的样式,所以无法看到鼠标经过和被激活时的效果<styletype=”text/css”>a:link{color:red;}…

    2022年7月19日
    15
  • rabitmq,redis以及kafuka作为消息队列的区别[通俗易懂]

    rabitmq,redis以及kafuka作为消息队列的区别[通俗易懂]kafukakafuka涉及到的名词词意解释:Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能。针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/119000000398…

    2022年4月30日
    53
  • Tensorfow中使用tf.identity()的作用

    Tensorfow中使用tf.identity()的作用先来看 TensorFlow 中对 identity 的定义 defidentity input name None nbsp pylint disable redefined builtin nbsp

    2025年7月7日
    2
  • listbox里面添加WrapPanel ,支持自适应换行[通俗易懂]

    listbox里面添加WrapPanel ,支持自适应换行[通俗易懂]listbox大家都会用,如果要让它支持换行操作还必须加上ListBox.ItemsPanelItemsPanelTemplatetoolkit:WrapPanel//ItemsPanelTemplate/ListBox.ItemsPanel但是也有问题了,必须设置WrapPanel的宽度,也就是不能自适应宽度去调整每一行的宽度,这样的后果可能会出现要么全部推在一起,要么要有横向的滚动…

    2022年7月22日
    12
  • PKI 体系

    PKI 体系PKI简介公开密钥基础建设(英语:PublicKeyInfrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。(PKI体系(一)-PKI介绍-简书)概念对称加密特点:加解密使用相同密钥,加解密过程速度快 算法:DES、3DES、AES非对称加密特点:加解密各用密钥对其中之一,密钥对公开的部

    2022年8月22日
    6
  • 拓端tecdat|基于R语言实现LASSO回归分析「建议收藏」

    拓端tecdat|基于R语言实现LASSO回归分析「建议收藏」模拟假数据集set.seed(0820)n<-50p<-25beta<-rep(0,p)beta[1:5]<-1:5/5X<-matrix(rnorm(n*p),n,p)X<-scale(X)Xb<-X%*%betaY<-X%*%b…

    2022年6月3日
    37

发表回复

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

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