目录

  1. H264打包RTP的方法

  2. RTP打包AAC

1. H264打包RTP的方法

RTP的特点不仅仅支持承载在UDP上,这样利于低延迟音视频数据的传输,另外一个特点是它允许通过其它协议接收端和发送端协商音视频数据的封装和编解码格式,这样固定头的playload type字段就比较灵活。

H.264标准协议定义了两种不同的类型:一种是VCL即Video Coding Layer , 一 种 是 NAL 即Network Abstraction Layer。其中前者就是编码器吐出来的原始编码数据,没有考虑传输和存储问题。后面这种就是为了展现H.264的网络亲和性,对VCL输出的slice片数据进行了封装为NALUs(NAL Units),然后再封装为RTP包进行传输。

NALU的基本格式是:NALU Header + NALU Data,其中NALU的头由一个字节组成如下所示:

一、
1-11就是NALU的单个包类型,但是一个NALU的大小是不一样的,如果是非视频数据的
SPS PPS才十几个字节,对于IDR帧,则有可能几十KB。
这样把NALU打包到RTP方式就很多,分为:
一个RTP包承载一个NALU;
多个NALU合并到一个RTP;
一个大的NALU切分成多个RTP。

二、
同时由于时间戳的问题,就有了24-29几种类型。
但是对于发送端组RTP包的一方来说,尽可能找简单的打包方式。对于接受端则需要适配各种发送
端的打包方式,因为无法决定输入源的打包方式。
(打包的时候不要搞太复杂的模式)

我们对于NALU的长度<=1400(rtp payload size)的则采用的是单一NALU打包到单一的RTP
包中;
我们对于NALU的长度>1400的则采用了FU-A的方式进行了打包,这种就是把一个大的NALU进
行了切分,最后接收方则进行了合并,把多个RTP包合并成一个完整的NALU即可;
为什么NALU的长度大于1400字节就要进行FU-A切片,是因为底层MTU大小值一般为1500,从
传输效率讲,使用1400作为切分条件。
RTP最大数据包(包含RTP头部) = MTU - UDP首部 - IP 报文首部

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

4.1、H264打包方式之Single NAL Unit

一个RTP包打包一个单独的NALU方式,其实最好理解,就是在RTP固定头后直接填充NLAU
单元数据即可,即:
RTP Header + NALU Header + NALU Data; (不包括startcode)
文件中的SPS:

RTP包中的SPS:

4.2、H264打包方式之FU-A

需要了解两个数据包头即FU indicator和Fu header。

4.2.1、FU indication

这里面的的F和NRI就是NALU头的前面三个bit位,后面的
TYPE就是NALU的FU-A类型28,这样在RTP固定头后面第一字节的后面5bit提取出来就确认了该
RTP包承载的不是一个完整的NALU,是其一部分。

那么问题来了,一个NALU切分成多个RTP包传输,那么到底从哪里开始哪里结束呢?
可能有人说RTP包固定头不是有mark标记么,注意区分那个是以帧图像的结束标记,这里要确定是NALU结束
的标记,其次NALU的类型呢?那么就需要RTP固定12字节后面的Fu Header来进行区分。

4.2.2、FU header

字段解释:
S: 1 bit 当设置成1,开始位指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开
始,开始位设为0。

E: 1 bit 当设置成1, 结束位指示分片NAL单元的结束,即, 荷载的最后字节也是分片NAL单元的最后
一个字节,当跟随的FU荷载不是分片NAL单元的最后分片,结束位设置为0。
也就是说一个NALU切片时,第一个切片的SE是10,然后中间的切片是00,最后一个切片时11。

R: 1 bit
保留位必须设置为0,接收者必须忽略该位。

Type: 5 bits
此处的Type就是NALU头中的Type,取1-23的那个值,表示 NAL单元荷载类型定义。

4.2.3、第一个IDR帧的NALU第一个切片

FU indication:
十六机制:0x7C
二进制:0111 1100
FU header:
十六进制:0x85
二进制:1000 0101
这里的SE是10,则说明该RTP包承载的NALU的第一个切片。

4.2.4、第一个IDR帧的NALU第二个切片

FU indication:
十六机制:0x7C
二进制:0111 1100
FU header:
十六进制:0x05
二进制:0000 0101
这里的SE是00,则说明该RTP包承载的NALU的中间切片。

4.2.5、第一个IDR帧的NALU最后一个切片

FU indication:
十六机制:0x7C
二进制:0111 1100
FU header:
十六进制:0x45
二进制:0100 0101
这里的SE是01,则说明该RTP包承载的NALU的最后一个切片。

2、RTP打包AAC

过程:

  1. 需要将aac的前7个(或9个)字节的ADTS去掉,即是跳过adts header。
  2. 添加RTP Header。
  3. 添加AU_HEADER_LENGTH。
  4. 添加AU_HEADER。
  5. 添加AU(去掉ADTS的aac数据)数据。

注意:一个RTP包中可以有一个AU-headers-length 和 n个AU-header和 n个AU(AU每包实际音频数据流)

5.1、AU-headers-length
头两个字节表示au-header的长度,单位是bit。 一个AU-header长度是两个字节(16bit)因为可以有多
个au-header所以AU-headers-length的值是 16的倍数,一般音频都是单个音频数据流的发送,所以
AU-headers-length的值是16
//AU_HEADER_LENGTH
bytes[12] = 0x00; //高位
bytes[13] = 0x10; //低位 只有一个AU_HEADER
因为单位是bit, 除以8就是auHeader的字节长度;又因为单个auheader字节长度2字节,所以再除以2就
是auheader的个数。
(注意:AU-header长度并不是固定为2字节,具体要看SDP)

5.2、AU-header
au-header的高13个bits就是一个au 的字节长度:
//AU_HEADER
bytes[14] = (byte)((len & 0x1fe0) >> 5); //高位
bytes[15] = (byte)((len & 0x1f) << 3); //低位
(注意:AU-header长度并不是固定为2字节,具体要看SDP)

5.3、AU

音频实际数据(去掉ADTS的aac数据)

5.4、RTSP/SDP中AAC相关配置

1 v=0
2 o=- 16128587303007558182 16128587303007558182 IN IP4 WINDOWS-75ID
U9Q
3 s=Unnamed
4 i=N/A
5 c=IN IP4 0.0.0.0
6 t=0 0
7 a=tool:vlc 3.0.5
8 a=recvonly
9 a=type:broadcast
10 a=charset:UTF-8
11 a=control:rtsp://192.168.2.195:8554/
12 m=audio 0 RTP/AVP 96
13 b=AS:128
14 b=RR:0
15 a=rtpmap:96 mpeg4-generic/22050
16 a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config
=138856e500; sizeLength=13; indexLength=3; indexDeltaLength=3; Pr
ofile=1;
17 a=control:rtsp://192.168.2.195:8554/trackID=4
18 m=video 0 RTP/AVP 96
19 b=AS:800
20 b=RR:0
21 a=rtpmap:96 H264/90000
22 a=fmtp:96 packetization-mode=1;profile-level-id=42c01e;sprop-para
meter-sets=Z0LAHtoCQKeX/8CgAJ/EAAADAZAAAF2qPFi6gA==,aM43IA==;
23 a=control:rtsp://192.168.2.195:8554/trackID=5

streamtype对于AAC, 固定为5。
profile-level-id固定为1。
config, SizeLength, IndexLength, IndexDeltaLength作用:
config是16进制的, 前两个字节 1388 , 表示采样率为22050, 1个channel。
前两个字节的为ios-14996-3中定义的AudioSpecificConfig, 前13个bits的格式为

samplingFrequencyIndex的取值:

1388 转换成2进制为 0001 0011 1000 1000
audioObjectType为 00010 , 即 2
samplingFrequencyIndex为 0111 , 即 7 , 对应的采样频率为 22050
channelConfiguration为 0001 , 表示channel数量为1。

sizeLength=13; indexLength=3; indexDeltaLength=3涉及到音频的AU Header。

5.5、AU-Header数据段的格式

其它的值都是可选的, 如果sdp中没有出现相关的参数(或者为0), 则表示它们不出现。
以最简单的情况举例, 假设aac数据长度为200字节, 只有一个au-header。
200 的二进制为 0000011001000。 (补足为13 bits)
AU-headers-length 值为16, 因为只有一个au-header, au-header中
只有AU-size和AU-Index, 共占用16bits。

整个au-header数据段的内容为

0000 0000 0000 1000 0000011001000 000

如果一个rtp中只有一个aac包, 不需要加AU-Header, 那么sdp中的aac参数可以简化为

a=fmtp:96 streamtype=5; profile-level-id=1; mode=AAC-hbr; config=1
38856e500;

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

音视频协议-RTP协议打包相关推荐

  1. 音视频之RTSP协议简介

    音视频之RTSP协议简介 RTSP简介 RTSP协议以客户端/服务器方式工作,如:暂停/继续.后退.前进等.它是一个多媒体播放控制协议,用来控制用户在播放从因特网下载的实时数据,因此 RTSP 又称为 ...

  2. Android MediaPlayer支持的音视频格式和协议

    Android MediaPlayer支持的音视频格式和协议 2018年04月18日 18:33:42 阅读数:11127 标签: MediaplayerIjkPlayerAndroid音视频Andr ...

  3. 音视频协议-RTP协议

    1 协议简介 音视频传输的基石:RTP和RTCP.对于协议的讲解主要是是对于RFC文档的阅读和理解.不同的使用场景用到的字段也有所侧重,RTP和RTCP定义在RFC3550中.其中RTP用于数据流的传 ...

  4. Type-C扩展坞常用料号大全|音视频芯片|cc协议芯片|PD芯片|HUB芯片|网口芯片|音频芯片

    最近一段时间因为重返职场,把市面上做Type-C 接口相关的常用料号做了整理.自己对CS型号的也更加了解,如何进行方案优化,降低BOM成本.慢慢整理,不断学习,持续更新记录,欢迎大家一起谈论学习. 音 ...

  5. 深入了解音视频开发直播协议RTMP

    说起RTMP协议,相信很多人都比较陌生,这个协议相对HTTP.HTTPS.TCP等我们常见的协议而言,我们在工作中确实较少接触它,但是对现在如火如荼的直播行业,RTMP是一个重要的协议,它在实时音视频 ...

  6. 音视频开发 RTMP协议发送H.264编码及AAC编码的音视频(C++实现)

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  7. 实时传输协议——RTP协议

    随着以太网音视频桥接(AVB)技术的引入,汽车可支持各种基于音频.视频的流媒体服务.在流媒体数据传输过程中,为保障音视频流的实时传输,需采用RTP和RTCP协议.接下来,我们一起来了解下实时传输协议吧 ...

  8. RTSP协议 RTP协议

    RTSP(Real-Time Streaming Protocol)实时流式协议 需要注意的是,RTSP本身不传输数据,音视频流数据是通过RTP传输的. C/S请求应答整体流程: 客户端->&g ...

  9. 从WebRtc学习RTP协议

    文章目录 TCP为何不适用于实时音视频 UDP->RTP RTP协议结构 Jittbuffer RTP扩展头 RTP填充数据 参考 TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的.按 ...

最新文章

  1. WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程
  2. 谷歌正在测试一个人工智能系统,帮助视障人士参加跑步比赛
  3. 【Linux】42.Ubuntu 18.04笔记本电脑关闭盖子无法唤醒问题解决
  4. 构建springmvc+mybatis+dubbo分布式平台-dubbo简介
  5. linux 软raid创建过程
  6. 【kafka】一次磁盘故障后消费者无法消费
  7. 字节跳动高伟豪:端到端深度召回算法
  8. 解决问题:swiper动态加载图片后无法滑动
  9. 【亲测有效】vs2017无法断点
  10. mysql 主从同步原理
  11. [WCF编程]10.操作:请求/应答操作
  12. 华为tftp服务器如何配置文件,配置tftp服务器
  13. dbm与mysql_DBM数据库 | 学步园
  14. syswow64删除文件_syswow64 c盘syswow64可以删除吗
  15. 编写代码的「八荣八耻」(上篇)
  16. html 边框重叠问题,详解css边距重叠的几种解决方案
  17. 昨天国际电子商情网站贴出了一篇文章《再论企业核心竞争力:为“黑芯”联发科喊冤》,引来争论无数
  18. 以太网采用的拓扑结构基本是什么型
  19. 数据、数据元素、数据项和数据对象
  20. 如何为自己的网站生成SSL证书

热门文章

  1. c语言阶乘编程题,C语言编程题:阶乘计算
  2. 七星彩长奖表图_2020海南七星彩奖表图最新
  3. 对计算机网络看法500字,500字信息技术学习评价
  4. 服务器磁盘显示RAW,高手解决u盘盘符打不开、变成RAW分区有妙招
  5. python123基本数据类型有哪些_python的基本数据类型
  6. 立法保护关键信息基础设施意义重大
  7. 软考新思维--2017年上半年信息系统项目管理师上午试题分析与答案(试题46-50题)
  8. Python爬取10000条“爆款剧”——《三十而已》热评,并做可视化
  9. 关于UCOS任务卡死的原因分析
  10. 交易员怎样于牛市中基于KDJ进行选股