从RTSP协议传输的H264视频流中取出每一个帧属于I、P、B中的哪一种帧

本文地址:http://www.cnblogs.com/herbix/p/4270035.html

RTSP是一个控制协议,其中的数据是用RTP传输的。
RTP使用了UDP,每个UDP包的内容区(没有UDP头)都包含以下的几个部分:

RTP_FIXED_HEADER
0                   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					片分区A
3					片分区B
4					片分区C
5					IDR图像中的片(I帧)
6					补充增强信息单元(SEI)
7					序列参数集(SPS)
8					图像参数集(PPS)
9					分界符
10					序列结束
11					码流结束
12					填充
13-23	reserved
24		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					1
1		2			10					010
2		3			11					011
3		4			100					00100
4		5			101					00101
5		6			110					00110
6		7			111					00111
7		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_type
0			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

时间: 2024-11-07 17:50:18

从RTSP协议传输的H264视频流中取出每一个帧属于I、P、B中的哪一种帧的相关文章

C#索引器:在集合或数组中取出某一个元素 举例 _【转】

Garmmar: [访问修饰符] 数据类型 this[参数列表] { get { 获取索引器的内容 } set { 设置索引器的内容 } } Eg: 1 <span style="font-size:14px;">using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace IndexerUsing 6 { 7 class Photo 8 { 9 10 private

Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握hand

如何在半径为1的圆中随机选取一个点

拿到这个题目大部分人的第一个思路是 在x轴[-1,1],y轴[-1,1]的正方形内随机选取一点.然后判断此点是否在圆内(通过计算此点到圆心的距离).如果在圆内,则此点即为所求:如果不在,则重新选取直到找到为止. 正方形的面积为4,圆的面积为pi,所以正方形内的随机点在圆内的概率是pi/4. 如果对机器学习的算法熟悉的话,这种方法叫做拒绝性采样.就是用一种容易生成的概率分布(本题是正方形的均匀分布),去模拟不容易生成的概率. 在单位圆上模拟均匀分布,要模拟满足概率分布 f 的随机变量,其中 f 满

基于EasyDarwin的实现无人机远程视频传输--RTSP协议分析篇

申明该文章参考了http://blog.csdn.net/haolipengzhanshen/article/details/50802081 的文章,在这里标示感谢! 这篇文章主要从几个方面分析EasyDarwin的RTSP内容 RTSP协议概述 wireshark抓包实例分析 一次完整RTSP的交互流程 EasyDarwin项目代码中 RTSP的初始化 EasyDarwin项目代码中 RTSP请求的处理过程 如果你是只想实现视频流的传输,对转发服务器没有太大要求,建议只要研究EasyDarw

流媒体传输协议系列之--RTSP协议详解

流媒体传输协议介绍 一.RTSP协议介绍 什么是rtsp? RTSP协议以客户服务器方式工作,,如:暂停/继续.后退.前进等.它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制, 因此 RTSP 又称为"因特网录像机遥控协议". RTSP(Real-Time Stream Protocol)是一种基于文本的应用层协议,在语法及一些消息参数等方面,RTSP协议与HTTP协议类似. 是TCP/IP协议体系中的一个应用层协议, 由哥伦比亚大学, 网景和RealN

从wireshark抓包分析rtmp协议,并提取出H264视频流

利用wireshark抓取rtmp流数据, 分析到rtmp流后,写入过滤条件,如 tcp.stream eq 6 导出tcp流 保存16进制的数据为纯文本格式 一定要选择 Hex转储,然后点击 "Sava as"注意,这个流开始的第一个字节一定是03,才是正确的.至此,我们有了可以用于分析的rtmp流的数据. 从wireshark抓包分析rtmp协议,并提取出H264视频流 原文地址:https://www.cnblogs.com/russinovich/p/9240944.html

HTTP协议/RTSP协议/RTMP协议的区别

RTSP. RTMP.HTTP的共同点.区别 共同点: 1:RTSP RTMP HTTP都是在应用应用层. 2: 理论上RTSP RTMPHTTP都可以做直播和点播,但一般做直播用RTSP RTMP,做点播用HTTP.做视频会议的时候原来用SIP协议,现在基本上被RTMP协议取代了. 区别: 1:HTTP: 即超文本传送协议(ftp即文件传输协议). HTTP:(Real Time Streaming Protocol),实时流传输协议. HTTP全称Routing Table Maintena

在iOS平台使用ffmpeg解码h264视频流

来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或URL传入即可打开.读取视频数据.解码器初始参数设置等,都可以通过调用API来完成. 但是对于h264流,没有任何封装格式,也就无法使用libavformat.所以许多工作需要自己手工完成. 这里的h264流指AnnexB,也

在iOS平台使用ffmpeg解码h264视频流(转)

在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或URL传入即可打开.读取视频数据.解码器初始参数设置等,都可以通过调用API来完成. 但是对于h264流,没有任何封装格式,也就无法使用libavformat.所以许多工作需要自己手工完成. 这里的h264流指AnnexB,也就是每个nal unit以起始码00 00 00 01 或 00 00 01开