一 概述

实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的。

RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTSP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础。RTP协议和RTP控制协议RTCP一起使用,而且它是创建在UDP协议上的。

当RTSP会话建立成功,并开始传输时,音视频数据以RTP协议打包发送给客户端;

二 RTP报头解析



V:RTP协议的版本号,占2位,当前协议版本号为2

P:填充标标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。

X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头

CC:CSRC计数器,占4位,指示CSRC 标识符的个数

M:标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始

PT:有效载荷类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等

sequence number:序列号,占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。接收者通过序列号来检测报文丢失情况,重新排序报文,恢复数据

timestamp:时间戳,占32位,时戳反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动,并进行同步控制

SSRC:同步信源标识符,占32位,用于标识同步信源。该标识符是随机选择的,对弈同一个视频源,每个会话都有自己独立的同步信源

CSRC:特约信源标识符,每个CSRC信源占32位,可以有0-15个,具体数量由CC决定,每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源

三 H264/H265 RTP打包分析1.RTP包头的封装

打包时,每帧数据包均需要添加二中所述RTP包头,对于每路视频流,RTP包头除序列号外,基本保持不变;另一个要注意的时,由于包头需要按位填充,当填充/发送数据时,应注意发送端数据的大小端限制。2.数据流的包头

此处以h264,h265,aac,g711来举例说明

g711数据在发送时,不需要额外的头部信息,其他三种数据流,在rtp包头后,应按格式封装自己的数据头

其中h264为一个字节,h265为两个字节,aac数据为四个字节

1.h264打包

视频包时需要考虑到MTU的大小,每包数据不能超过MTU的大小,通常情况下,设备是不知道当前网络的MTU大小的。

因此都会在代码中指定一个大小,开发时,可以参考ffmpeg中给定该值的大小

H264数据打包格式如下:

RTP头+h264字节头+视频数据帧

h264字节头为两个字节,格式如下

第一个字节



根据ffmpeg代码,F为0,此处type为28,

nri = buff[0] & 0x60;

buff[0] 为视频帧的第一个数据

第二个字节



此处type = buff[0] & 0x1f;

其中S E R的解释如下,



注意当数据包被分成多包数据后,处S E R三位,其他均与第一包保持一致,不得改变

2.h265打包

打包和h264过程类似,区别就是H265的数据头为三个字节,

h265的三个字节,结构如下:

第一第二个字节



参考ffmpeg代码 此处F为0,Type为49,LayerId为0,TID为1

第三个字节

其中FuType = (buf[0] >> 1) & 0x3F;

S E的用法和h264中相同,此处不再叙述3.aac打包

aac在打包为RTP数据包时,每帧数据前还应该由四个字节头,即格式如下

RTP包头+AAC字节头+AAC数据

当AAC数据前由ADTS头时, 打包时应该跳过7字节的ADTS头

AAC字节头定义如下

字节1:0x00

字节2:0x01

字节3:(data_len & 0x1fe0) >> 5

字节4:(data_len &0x1f) << 3

四 参考代码

ffmpeg代码 rtpenc_h264_hevc.c文件

void ff_rtp_send_h264_hevc(AVFormatContext *s1, const uint8_t *buf1, int size);

此处注意,该函数将h264和h265的nalu打包放在了同一个函数中,注意根据判断语句来区分。

RTP协议解析及H264/H265 音视频RTP打包分析的更多相关文章

  1. 音视频RTP数据包封装

    对于语音通信而言,语音码率较低,添加适当冗余是对抗网络丢包的常见方式.冗余方式有多种,包括RED,FEC等都是冗余的一种,如果冗余份数较多,可以采取交织的方式实现.RFC 3350是RTP的基础标准协 ...

  2. ffmpeg转码MPEG2-TS的音视频同步机制分析

    http://blog.chinaunix.net/uid-26000296-id-3483782.html 一.FFmpeg忽略了adaptation_field()数据 FFmpeg忽略了包含PC ...

  3. ffmpeg 2.3版本号, 关于ffplay音视频同步的分析

    近期学习播放器的一些东西.所以接触了ffmpeg,看源代码的过程中.就想了解一下ffplay是怎么处理音视频同步的,之前仅仅大概知道通过pts来进行同步,但对于怎样实现却不甚了解,所以想借助这个机会, ...

  4. Android多媒体框架总结(1) - 利用MediaMuxer合成音视频数据流程分析

    场景介绍: 设备端通过服务器传向客户端(Android手机)实时发送视频数据(H.264)和音频数据(g711a或g711u), 需要在客户端将音视频数据保存为MP4文件存放在本地,用户可以通过APP ...

  5. (转)RTP协议全解(H264码流和PS流)

    写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...

  6. RTP协议全解(H264码流和PS流)

    写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...

  7. H264 RTP包解析

    1.  预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码. h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流 ...

  8. android音视频点/直播模块开发

      音视频 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白, ...

  9. Android音视频点/直播模块开发实践总结-zz

    随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能.那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及 ...

随机推荐

  1. kafka-伪集群搭建

      一.简介 Apache Kafka是一个快速.可扩展的.高吞吐的.可容错的分布式"发布-订阅"消息系统,使用Scala与Java语言编写,能够将消息从一个端点传递到另一个端点, ...

  2. 使用docker安装E

     环境 虚拟机软件VmWare15.5 Centos7.0 安装docker yum install docker

  3. linux(centos8):使用zip/unzip压缩和解压缩文件

    一,查看zip命令所属的rpm包 1,zip [root@kubemaster ~]# whereis zip zip: /usr/bin/zip /usr/share/man/man1/zip.1. ...

  4. Django创建表时报错django.db.utils.InternalError: (1366问题解决记录

    问题出现 执行Python manage.py makemigrations生成创建表的py文件 执行python manage.py migrate创建数据表 界面出现报错 问题原因 网上搜索原因, ...

  5. JavaSE学习笔记04方法、数组

    1.方法 java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:一个方法只完成1个功能,这样 ...

  6. day04基本数据类型

    内容补充 编译器和解释器:牵扯到编译型语言和解释型语言 编译型语言:JAVA C C# C++ 写好的代码交给编译器,编译器会编译成一个新的文件交给计算机执行 解释型语言:python PHP 写好的 ...

  7. laravel 验证码 auth方式登录 中间件判断session是否存在

    首先下载laravel的插件 composer下载  实现验证码       composer require mews/captcha 在config/app.php进行配置 'providers' ...

  8. JavaScript 正则表达式:字符串中查找数字

    以下代码是在一段字符串中,用正则表达式找到数字,使用 replace() 方法,用找到的数字的两倍值替换原数字.replace() 方法的第二个参数为一个函数,返回找到数字的两倍值. <scri ...

  9. Express 配置HTML页面访问

    Express 配置HTML页面访问 1.配置模板引擎 Express默认的模板引擎是pug(jade),想要渲染html页面必须要导入对应的模板引擎ejs npm install ejs 安装完成在 ...

  10. NB-IoT的RLC子层服务功能

    NB-IoT只支持RLC子层的确认模式(Acknowledgement Mode,AM),不支持非确认模式(Unacknowledged Mode,UM). 对于支持UP模式的UE,NB-IoT支持R ...