博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从RTSP协议传输的H264视频流中取出每一个帧属于I、P、B中的哪一种帧
阅读量:5162 次
发布时间:2019-06-13

本文共 3074 字,大约阅读时间需要 10 分钟。

本文地址:

RTSP是一个控制协议,其中的数据是用RTP传输的。

RTP使用了UDP,每个UDP包的内容区(没有UDP头)都包含以下的几个部分:

RTP_FIXED_HEADER0                   1                   2                   3 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 2+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X|  CC   |M|     PT      |       sequence number         | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                           timestamp                           | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |           synchronization source (SSRC) identifier            | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ |            contributing source (CSRC) identifiers             | |                             ....                              | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

V: 版本

P: 填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。
CC: CSRC的个数
M: 对于H264视频帧,表示这是最后一个分片
PT: 载荷类型,H264是96(0x60)
SSRC: 会话标识
CSRC: 忘记了

紧随其后的是NALU_HEADER

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

F: 始终为0

NRI: 重要性
Type: 类型

Type	Packet		Type name                       ----------------------------------------------------0		undefined                                 1					不分区,非IDR图像的片(I, P, B帧)2					片分区A3					片分区B4					片分区C5					IDR图像中的片(I帧)6					补充增强信息单元(SEI)7					序列参数集(SPS)8					图像参数集(PPS)9					分界符10					序列结束11					码流结束12					填充13-23	reserved24		STAP-A		Single-time aggregation packet    25		STAP-B		Single-time aggregation packet    26		MTAP16		Multi-time aggregation packet     27		MTAP24		Multi-time aggregation packet     28		FU-A		Fragmentation unit                29		FU-B		Fragmentation unit                 30-31	undefined

  

如果H264的Slice过大,无法装入一个UDP包中,一般来说这里就要分包。分包时,NALU_HEADER中Type字段为FU-A(28),下一字节为FU_HEADER。

FU_HEADER+---------------+|0|1|2|3|4|5|6|7|+-+-+-+-+-+-+-+-+|S|E|R|  Type   |+---------------+

S: 开始的片

E: 结束的片
R: 始终为0
Type: 类型,和NALU_HEADER的类型一致

后面的部分就是H264的内容了。H264是按照Slice传输的,每个Slice有一个Slice头,据说Slide头使用了指数哥伦布编码(k=0),需要先进行解码。

指数哥伦布编码(k=0):

数据	数据+1		写作二进制(n位)	前加n-1个0(编码结果)0		1			1					11		2			10					0102		3			11					0113		4			100					001004		5			101					001015		6			110					001106		7			111					001117		8			1000				0001000...		...			...					...

解码就反过来,先数0的个数,然后再取相应位数的数据出来。

011110100001101 -> 011 1 1 010 0001101 -> 11 1 1 10 1101 -> 3 1 1 2 13 -> 2 0 0 1 12

Slide头的第二个参数为slice_type,也就是解出来的第二个数,表示IPB帧:

slice_type	Name of slice_type0			P (P slice)1			B (B slice)2			I (I slice)3			SP (SP slice)4			SI (SI slice)5			P (P slice)6			B (B slice)7			I (I slice)8			SP (SP slice)9			SI (SI slice)

  

参考:

[1] http://blog.csdn.net/jefry_xdz/article/details/8461343
[2] http://www.cnweblog.com/fly2700/archive/2012/02/23/319718.html
[3] http://blog.csdn.net/wangjiannuaa/article/details/6966505
[4] http://blog.sina.com.cn/s/blog_4171e65d0100o4pt.html
[5] http://baike.baidu.com/view/1268656.htm?fromtitle=RTP&fromid=8974125&type=syn

转载于:https://www.cnblogs.com/herbix/p/4270035.html

你可能感兴趣的文章
WHAT I READ FOR DEEP-LEARNING
查看>>
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
读《构建之法-软件工程》第四章有感
查看>>
使用 Printf via SWO/SWV 输出调试信息
查看>>
.net 分布式架构之分布式锁实现(转)
查看>>
吴恩达机器学习笔记 —— 3 线性回归回顾
查看>>
Problem E: Automatic Editing
查看>>
SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
查看>>
《DSP using MATLAB》Problem 6.17
查看>>
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
一周TDD小结
查看>>
sizeof与strlen的用法
查看>>
Linux 下常见目录及其功能
查看>>
开源框架中常用的php函数
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>