RTP载荷H264视频

RTP协议--介绍 数据传输协议RTP,用于实时传输数据。RTP报文由两部分组成:报头和有效载荷。 阅读详情

《音视频应用开发系列文章目录》

编码RTP over H264的大致过程

1.判断H264的NALU数据大小和MTU(Maximum Transmission Unit[normal 1500bytes])的关系

  小于MTU:发送整个NALU

  大于MTU:分片发送NALU

2.添加RTP12字节的头

3.case小于MTU:添加payload(NALU数据)

4.case大于MTU:根据NALU的第一个字节添加FUindicator,FUheader两个字节,最后添加payload(NALU数据移除第一字节)

NALU结构

NALU由NAL头(占1byte)+RBSP(Raw Byte Sequence Payload)组成。RBSP的结构为原始编码数据的后面填充1 bit'1'和n bit'0',为了字节对齐。NALU头如下格式。

+-------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-
|F|NRI|  Type   |
+-------------+

F:forbidden_zero_bit,1位,如果有语法冲突,则为1。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。

NRI:nal_ref_idc,2位,用来指示该NALU的重要性等级。值越大,表示当前NALU越重要。

Type:5位,NALU的类型。Type值为7和8的NALU分别为序列参数集sps和图像参数集pps。参数集是一组很少改变的,为大量VCL NALU 提供解码信息的数据。其中序列参数集作用于一系列连续的编码图像,而图像参数集作用于编码视频序列中一个或多个独立的图像。如果解码器没能正确接收到这两个参数集,那么其他NALU也是无法解码的。因此它们一般在发送其它NALU之前发送,并且使用不同的信道或者更加可靠的传输协议TCP进行传输,也可以重复传输。

Type取值和含义如下表:

0没有定义 
1SLICE不分区、非IDR图像的片
2DPA片分区A
3DPB片分区B
4DPC片分区C
5IDR_SLICEIDR图像中的片
6SEI补充增强信息单元
7SPS序列参数集
8PPS图像参数集
9AUD分界符
10END_SEQUENCE序列结束
11END_STREAM码流结束
12FILLER_DATA填充
24STAP-A单一时间的组合包
25STAP-B单一时间的组合包
26MTAP16多个时间的组合包
27MTAP24多个时间的组合包
28FU-A分片的单元
29FU-B分片的单元
30没有定义 
31没有定义 

RTP打包图-case小于MTU

RTP打包图-case大于MTU

伪代码

void rtp_send_h264(char *data, int len){
	
	if(len <= MTU){
		
		rtp_send_h264_nalu(data, len);
	}else{
		
		rtp_send_h264_nalu_fu(data, len);
	}
}

void rtp_send_h264_nalu(char *data, int len){
	
	char buf[MTU];
	// fix buf[0~11] for rtp head
	memcpy(&buf[0], &rtp_head, 12); 
	// fix nalu data
	memcpy(&buf[12], data, len);
	rtp_send(buf, len + 12);
}

void rtp_send_h264_nalu_fu(char *data, int len){
	
	char buf[MTU];
	// fix buf[0~11] for rtp head
	memcpy(&buf[0], &rtp_head, 12); 
	// fix FUindicator(1 byte)
	// 指示indicator的Type=28为FU-A
	// indicator结构
	// +---------------+
	// |0|1|2|3|4|5|6|7|
	// +-+-+-+-+-+-+-+-+
	// |F|NRI|  Type   |
	// +---------------+
	char fu_indicator = ((data[0] & 0b11100000) | 28); 
	// fix FUheader(1 byte)
	// 指示header的Type为原NALU的Type
	// iheader结构
	// +---------------+
	// |0|1|2|3|4|5|6|7|
	// +-+-+-+-+-+-+-+-+
	// |S|E|R|  Type   |
	// +---------------+
	// S=1,E=0表示NALU分片的开始
	// S=0,E=1表示NALU分片的结束
	// R为保留位
	char fu_header = (data[0] & 0b00011111);
	// skip raw NALU head(1 byte)
	data += 1; 
	len -= 1;
    // fill fu_indicator and fu_header
	buf[12] = fu_indicator;
	buf[13] = fu_header;
	// start send:S=1 E=0 R=0
	// middle send:S=0 E=0 R=0
	// end send:S=0 E=1 R=0
	while(1){
	
		if(MTU < len){
		
			// fix payload
			memcpy(&buf[14], data, MTU);
			rtp_head.mark = 0;
			rtp_send(buf, MTU + 14);
			len -= MTU;
			data += MTU;
		}else{ // it's end
			
			// fix last payload and set rtp mark the frame end
			memcpy(&buf[14], data, len);
			rtp_head.mark = 1;
			rtp_send(buf, len + 14);
			break;
		}
	}
}

RTSP->SDP

v=0
o=username 1291468791 1 IN IP4 
s=h264
c=IN IP4 0.0.0.0
t=0 0
a=range:npt=0-
a=sendonly
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:track0

 

 

wireshark从RTP包中提取出H264裸流数据脚本 wireshark从RTP包中提取出H264裸流数据脚本 wireshark RTP H264 H265 立即下载

相关推荐

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 730

H264 over RTP学习总结

每个RTP包,由RTP头标准字段(固定12字节)、RTP头扩展字段、RTP负载、填充字段组成, V:RTP协议的版本号,占2位,当前协议版本号为2; P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。如果P=1,需要查看这一个RTP包文最后一个字节(该字节的值只可能为1,2,3),如果字节值是0x01,说明只有一个字节填充;如果是0x02, 说明有两个字节填充;如果字节值是0x03,说明有...

yang___xin的博客 658

Spring WebFlux响应式编程实战(三):优雅处理异常与高效调试技巧

本文深入探讨了Spring WebFlux响应式编程中的异常处理与调试技巧。文章通过电商订单流处理场景,详细解析了Reactor核心操作符onErrorReturn、onErrorResume和onErrorMap的实战应用,并介绍了如何构建@ControllerAdvice和WebExceptionHandler全局异常处理防线。同时,提供了使用.log()操作符、Hooks.onOperatorDebug()及BlockHound进行高效调试的方法,旨在帮助开发者构建健壮、可维护的响应式应用。

weixin_29252171的博客 67

NALU拆包

在讲负载(Payload)前,我们先看看RTP以UDP发送h264数据时的3种打包情况。 由于UDP数据报长度超过1500字节时(俗称MTU),会自动拆分发送,增大了丢包概率,那么去除UDP数据报头以及RTP的Header部分,一般设置Payload部分最大长度为1400字节即可,那么对H264的NALU单元打RTP就意味着3种情况. 第一:RTP包里只包含一个NALU,(它的数据小于1400字节) 第二:RTP包里只包含N个NALU,(N个NALU的数据累加小于1400字节) 第三:NALU数据大于140

qq_38978328的博客 421

Python爬虫实战:用Selenium+ChromeDriver批量抓取政府网站政策文件(附完整代码)

本文详细介绍了使用Python的Selenium和ChromeDriver进行政府网站政策文件批量抓取的实战技巧。从环境配置、动态页面元素定位到分页机制破解和反爬虫策略,提供了完整的解决方案和代码示例,帮助开发者高效获取结构化政策数据。

weixin_42531710的博客 266

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1625

H264 Over RTP

转载注明出处:http://blog.sina.com.cn/s/blog_465bdf0b010002t1.html RTP包头还是贴一下吧,看起来方便:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

专注嵌入式 -- 分享、进步 1007

软考高级架构师笔记-10数学计算题

专栏《软考高级架构设计师》更新了,本章列举了10个场景计算题的解法,温故而知新,大家快来卷一卷

java后端开发的博客,不仅仅是后端开发 1598

RTP打包发送H264(下)

对于H264的I帧、P帧等主要是

TRTK 1979

【DeepSeek应用实践】手把手教程:用 AnythingLLM + Ollama + DeepSeek-R1 搭建本地企业知识库

在众多的技术方案中,我们选择了 AnythingLLM、Ollama 和 DeepSeek-R1 这一组合来搭建本地知识库。Ollama 作为一个轻量级的本地化大语言模型部署工具,支持多种模型,易于安装和使用,能够快速在本地运行强大的语言模型。DeepSeek-R1 是一个专为知识库问答设计的检索增强生成(RAG)模型,它结合了检索和生成的优势,能够快速从知识库中检索相关信息并生成精准答案。而 AnythingLLM 则是一个用户友好的界面工具,可以方便地连接 Ollama 和 DeepSeek-R1

寻道AI,探索AI无限可能! 2569

环境配置与基础教程:当前大厂主流套路:使用 MLflow 全链路管理 YOLO 实验参数、指标与模型版本

YOLO26与MLflow结合实现高效实验管理 YOLO26通过移除DFL模块和实现无NMS端到端推理,在CPU推理速度上提升43%,同时简化了模型导出流程。MLflow 3.10/3.11版本新增多工作区支持、成本追踪和安全序列化等功能,为机器学习实验提供全生命周期管理。两者结合可解决传统"截图+Excel"式实验管理的痛点,实现参数追踪、指标对比和模型版本控制的自动化。 关键优势: YOLO26架构优化带来显著性能提升 MLflow提供实验到生产的全链路管理 原生集成简化了计算机视觉

ZXSXJ的博客 191

live555学习笔记11

十一 h264 RTP传输详解(3)书接上回:H264FUAFragmenter又对数据做了什么呢? void H264FUAFragmenter::doGetNextFrame() { if (fNumValidDataBytes == 1) { // We have no NAL unit data currently in the buffer. Read a new one:...

wodamazi 257

【华为OD技术面试真题 - 技术面】- 测试面试题(1)

专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录黑盒测试:白盒测试:基本功能验证:边界条件测试:空白输入测试:特殊字符和格式测试:响应时间测试:压力测试:针对在不同系统和设备上测试聊天窗口功能,以及网络正常的前置条件,我们可以增加以下测试用例:系统和设备:PC端测试:移动端测试:功能验证:前置条件:网络性能影响测试:Postman:SoapUI:JMeter:Rest-Assured:Tricentis Tosca:ReadyAPI:CI/CD工具集成:测试管理工

算法大师! 3690

RTP载荷H264视频流

H264 RTP包解析 预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码。 h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流,采用H264编码后形成的码流就是h264裸码流。 码流传输: 发送端将H264裸码流打包后进行网络传输,接收端接收后进行组包还原裸码流,然后可以再进行存储,转发,...

天空的博客 5万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

16.H264的网络传输RTP协议解析

一:RTP头协议头如下:

yanghangwww的博客 1366

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

H.264视频流的传输与载荷——将H264码流打包成RTP包

http://blog.youkuaiyun.com/bytxl/article/details/50393198 从摄像头获取的视频数据,经过编码后(当然,也可以不编码,如果你觉得也很ok的话),可以视频录制,同时如果需要,当然也可以视频远程传输咯,而实时传输协议(Real-time Transport Protocol,RTP)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(u...

sunxiaopengsun的专栏 1151

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

网络流媒体(三)————RTP流

1. 简介 实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。 ...

yangguoyu8023的博客 7499

RTP载荷H264(实战细节)

seq : 用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1, 不同的源有独立的计数体制,如音频视频的seq是独立的。FU indication和FU header之后便是H264的载荷数据,该载荷数据去掉了H264的起始码和起始码后的第一个字节, 因为该字节的信息已经全部由FU indication和FU header包含。m : 标记,编辑帧的开始和结束,例如一帧的数据比较大,分成了好多RTP包进行传输,则最后一包m=1带包一帧数据传输完成,其他包m=0。

qq_39466755的博客 1160

rtp协议打包拆包h264数据

rtp协议打包拆包h264数据 文章目录rtp协议打包拆包h264数据nalu头rtp包头rtp打拆包h264打包拆包 最近也在玩直播了,会写一点流媒体和ffmpeg滤波器和编解码器API方面的文章,本文简述一下rtp打包h264和拆包h264数据的方法。 nalu头 H264在网络上传输的是NALU,NALU的结构是:NAL头+RBSP NAL头只有一个字节: ±--------------...

靑い空゛ 1673

RTP协议封装H264/H265/AAC

在RTSP的流媒体服务器中音视频的传输通过RTP封装为若干个RTP包;每个RTP包由RTP Header和音视频载荷(Payload)组成;RTP Header包含固定头和扩展头;如下图所示,蓝色块是RTP Herder部分,绿色块是音视频载荷,绿色框表示分成的多个RTP包体。

u010140427的博客 4932

RTP/RTCP(一)-H264关于RTP协议的实现

H264关于RTP协议的实现2010-07-22 13:35完整的C/S架构的基于RTP/RTCP的H.264视频传输方案。此方案中,在服务器端和客户端分别进行了功能模块设计。服务器端:RTP封装模块主要是对H.264码流进行打包封装;RTCP分析模块负责产牛和发送RTCP包并分析接收到的RTCP包;QoS反馈控制模块则根据RR报文反馈信息动态的对发送速率进行调整;发送缓冲模块则设置端口发送RT...

SurpassLi的专栏 51

RTP载荷AAC

RTP载荷H264RTP载荷H265AAC音频格式ADTS头详解RTP包的结构: RTP头在 “RTP载荷H264(实战细节)”讲的很清楚了,不了解的可以从上面链接进入查看,AAC中RTP头的使用方法和H264一样,下面介绍下RTP载荷AAC的载荷结构: 载荷和H264的载荷方式是一样的,根据帧数据的大小分为:单包,分片包,聚合包。具体的解释请参考“RTP载荷H264(实战细节)”。一般情况下音频帧只有几百字节,不会使用分片包,又由于聚合包不常用,所以本章说下单包封装AAC的载荷

qq_39466755的博客 576

纯C语言解析RTP包的头部

2、填充位(P):占1位,如果P=1,则该RTP包的尾部包含附加的填充字节。3、作用是为了字节对齐,填充字节的数量保存在最后一个字节中 4、扩展位(X):占1位,如果X=1,则RTP固定头部后面就跟有一个扩展头部,即上面的CSRC信息 5、CSRC计数器(CC):占4位,指示 CSRC标识符的数量。6、载荷类型(PT):占7位,标识了RTP载荷的类型,比如是视频还是音频类型 7、序列号(SN):占16位,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。

YIZIMU的博客 1461

H264关于RTP协议的实现

H264关于RTP协议的实现 完整的C/S架构的基于RTP/RTCP的H.264视频传输方案。此方案中,在服务器端和客户端分别进行了功能模块设计。 服务器端:RTP封装模块主要是对H.264码流进行打包封装;RTCP分析模块负责产牛和发送RTCP包并分析接收到的RTCP包;QoS反馈控制模块则根据RR报文反馈信息动态的对发送速率进行调整;发送缓冲模块则设置端口发送RTP、RTC

chinabinlang的专栏 563
上一篇: RTP载荷AAC音频
下一篇: RTP载荷G711A/G711U/PCM/G726音频
KayChanGeek
KayChanGeek 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄11年 926粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值