fmtp

更新时间:2023-04-17 19:17:39 阅读: 评论:0


2023年4月17日发(作者:JMP)RTP包格式详细解析
H.264 视频 RTP 负载格式
1. ⽹络抽象层单元类型 (NALU)
NALU 头由⼀个字节组成, 它的语法如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
F: 1 个⽐特.
forbidden_zero_bit. H.264 规范中规定了这⼀位必须为 0.
NRI: 2 个⽐特.
nal_ref_idc. 00 ~ 11, 似乎指⽰这个 NALU 的重要性, 00 NALU 解码器可以丢弃它⽽不影响图像的回放. 不过⼀般情况下不太关⼼
这个属性.
Type: 5 个⽐特.
nal_unit_type. 这个 NALU 单元的类型. 简述如下:
0 没有定义
1-23 NAL单元 单个 NAL 单元包.
24 STAP-A 单⼀时间的组合包
25 STAP-B 单⼀时间的组合包
26 MTAP16 多个时间的组合包
27 MTAP24 多个时间的组合包
28 FU-A 分⽚的单元
29 FU-B 分⽚的单元
30-31 没有定义
2. 打包模式
下⾯是 RFC 3550 中规定的 RTP 头的结构.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | quence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
负载类型 Payload type (PT): 7 bits
序列号 Sequence number (SN): 16 bits
时间戳 Timestamp: 32 bits

H.264 Payload 格式定义了三种不同的基本的负载(Payload)结构. 接收端可能通过 RTP Payload
的第⼀个字节来识别它们. 这⼀个字节类似 NALU 头的格式, ⽽这个头结构的 NAL 单元类型字段
则指出了代表的是哪⼀种结构,

这个字节的结构如下, 可以看出它和 H.264 NALU 头结构是⼀样的.
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
字段 Type: 这个 RTP payload NAL 单元的类型. 这个字段和 H.264 中类型字段的区别是, type
的值为 24 ~ 31 表⽰这是⼀个特别格式的 NAL 单元, H.264 , 只取 1~23 是有效的值.

24 STAP-A 单⼀时间的组合包
25 STAP-B 单⼀时间的组合包
26 MTAP16 多个时间的组合包
27 MTAP24 多个时间的组合包
28 FU-A 分⽚的单元
29 FU-B 分⽚的单元
30-31 没有定义
可能的结构类型分别有:
1. 单⼀ NAL 单元模式
即⼀个 RTP 包仅由⼀个完整的 NALU 组成. 这种情况下 RTP NAL 头类型字段和原始的 H.264
NALU 头类型字段是⼀样的.
2. 组合封包模式
即可能是由多个 NAL 单元组成⼀个 RTP . 分别有4种组合⽅式: STAP-A, STAP-B, MTAP16, MTAP24.
那么这⾥的类型值分别是 24, 25, 26 以及 27.
3. 分⽚封包模式
⽤于把⼀个 NALU 单元封装成多个 RTP . 存在两种类型 FU-A FU-B. 类型值分别是 28 29.
2.1 单⼀ NAL 单元模式
对于 NALU 的长度⼩于 MTU ⼤⼩的包, ⼀般采⽤单⼀ NAL 单元模式.
对于⼀个原始的 H.264 NALU 单元常由 [Start Code] [NALU Header] [NALU Payload] 三部分组成, 其中 Start Code ⽤于标⽰这是⼀个
NALU 单元的开始, 必须是 "00 00 00 01" "00 00 01", NALU 头仅⼀个字节, 其后都是 NALU 单元内容.
打包时去除 "00 00 01" "00 00 00 01" 的开始码, 把其他数据封包的 RTP 包即可.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|NRI| type | |
+-+-+-+-+-+-+-+-+ |
| |
| of a Single NAL uni眼字成语 t |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
如有⼀个 H.264 NALU 是这样的:
[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
这是⼀个序列参数集 NAL 单元. [00 00 00 01] 是四个字节的开始码, 67 NALU , 42 开始的数据是 NALU 内容.
封装成 RTP 包将如下:
[ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]
即只要去掉 4 个字节的开始码就可以了.
2.2 组合封包模式
其次, NALU 的长度特别⼩时, 可以把⼏个 NALU 单元封在⼀个 RTP 包中.


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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAP-A NAL HDR | NALU 1 Size | NALU 1 HDR椒盐土豆 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Dguard是什么意思 ata |
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 Size | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 Data |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2.3 Fragmentation Units (FUs).
⽽当 NALU 的长度超过 MTU , 就必须对 NALU 单元进⾏分⽚封包. 也称为 Fragmentation Units (FUs).

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FU indicator | FU header | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| FU payload |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 14. RTP payload format for FU-A
The FU indicator octet has the following format:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
The FU header has the following format:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
3. SDP 参数
下⾯描述了如何在 SDP 中表⽰⼀个 H.264 :
. "m=" ⾏中的媒体名必须是 "video"
. "a=rtpmap" ⾏中的编码名称必须是 "H264".
. "a=rtpmap" ⾏中的时钟频率必须是 90000.
. 其他参数都包括在 "a=fmtp" ⾏中.
:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; sprop-parameter-ts=Z0IACpZTBYmI,aMljiA==
下⾯介绍⼀些常⽤的参数.
3.1 packetization哈利波特读书笔记 -mode:
表⽰⽀持的封包模式.
packetization-mode 的值为 0 时或不存在时, 必须使⽤单⼀ NALU 单元模式.
packetization-mode 的值为 1 时必须使⽤⾮交错(non-interleaved)封包模式.
packetization-mode 的值为 2 时必须使⽤交错(interleaved)封包模式.
这个参数不可以取其他的值.
3.2 sprop-parameter-ts:
这个参数可以⽤于传输 H.264 的序列参数集和图像参数 NAL 单元. 这个参数的值采⽤ Ba64 进⾏编码. 不同的参数集间⽤","号隔开.

3.3 profile-level-id:
这个参数⽤于指⽰ H.264 流的 profile 类型和级别. Ba16(⼗六进制) 表⽰的 3 个字节. 第⼀个字节表⽰ H.264 Profile 类型,
三个字节表⽰ H.264 Profile 级别:

3.4 max-mbps:
这个参数的值是⼀个整型, 指出了每⼀秒最⼤的宏块处理速度.
re: H.264 RTP payload 格式 2009-12-25 17:17
⾟苦啦。
在组合封包时,NALU 1 Size前⾯没有提到,它是属于NALU payload吧。也就是说h264 NALU payload = NALU payload size + NALU
pa佛家经典名言 yload header + NALU payload data,对吧。如果我的理解不对,请指正,谢谢。
re: H.264 RTP payload 格式 2009-12-29 13:20
@heshui
基本上是这样⼦的
如有⼀个 H.264 NALU 是这样的:
[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
这是⼀个序列参数集 NAL 单元. [00 00 00 01] 是四个字节的开始码, 67 NALU , 42 开始的数据是 NALU 内容.
封装成 RTP 包可能如下:
[ RTP Header ] [78, STAP-A NAL HDR, ⼀个字节 ] [长度, 两个字节] [ 67 42 A0 1E 23 56 0E 2F ...] [长度, 两个字节] [ 67 42 A0 1E 23 56 0E
2F... ]

请问分⽚封包的实际例⼦ 2010-01-04 09:36
@暗⿊长⽼ 万能开头作文
楼主能不能再给我⼀个分⽚封包的实际例⼦,就是说如果NALU 的长度超过 MTU RTP包格式应该是怎么样的呢。谢谢。
re: H.264 RTP payload 格式[未登录] 2010-01-06 15:14

@heshui
/** 发送指定的 NALU 单元. */
int GEPlayback::SendNaluPacket( BYTE* sliceData, int sliceSize, BOOL isEnd,
BOOL isVideo, int type, time_t pts, INT64 timestamp )
{
// NALU ⼩于最⼤ RTP 包⼤⼩的情况
if (sliceSize < 1350) {
return SendPacket(sliceData, sliceSize, isEnd, TRUE, type, pts, timestamp);
}
// 如果⼀个 NALU ⼤于最⼤的 RTP 包的⼤⼩, 则需要把它进⾏分⽚后打包发送
BYTE buffer[1500];
BYTE nalHeader = sliceData[0]; // NALU
BYTE* data = sliceData + 1;
int leftover = sliceSize - 1;
BOOL isStart = TRUE;
while (leftover > 0) {
int size = MIN(1350, leftover);
isEnd = (size == leftover);
// 构建 FU
buffer[0] = (nalHeader & 0x60) | 28; // FU indicator
buffer[1] = (nalHeader & 0x1f); // FU header
if (isStart) {
buffer[1] |= 0x80;
}
if (isEnd) {
buffer[1] |= 0x40;
}
memcpy(buffer + 2, data, size);
SendPacket(buffer, size + 2, isEnd, TRUE, type, pts, timestamp);
leftover -= size;
data += size;
isStart = FALSE;
}
return sliceSize;
}

re: H.264 RTP payload 格式 2010-01-09 17:27
前⼏天不⼩⼼把⽔泼到本本上,没能即时观注楼主的回复,换了块主板,嘿嘿。
代码很详细,看了例⼦很清淅。
谢谢楼主多次回复:)
re: H.264 RTP payload 格式 2010-01-29 09:11
hao
re: H.264 RTP payload 格式 2010-02-09 10:49
找了好多篇
這篇最清楚
感謝

re: H.264 RTP payload 格式 2010-04-26 08:32
⾮常感谢你,正在研究流媒体,听⽼⽜们说,学这个协议⽐较好。
re: H.264 RTP payload 格式 2010-07-09 14:33
你是在哪个城市的,⽅便留个电话什么的联系⽅式,我们这边有个流媒体相关的项⽬,寻求⼯程师合作开发。我邮箱是:
n@
re: H.264 RTP payload 格式 2010-07-14 10:21
请教个问题,H.264RTP发送中三种模式(单NAL单元模式、⾮交互模式、交互模式)和三种负载结构(单NAL单元包、聚合包、分⽚
包)是怎么区别,我怎么感觉⼀样 了?谢谢......
re: H.264 RTP payload 格式 2010-07-14 10:25
@sc
通过这个表可以⽐较清楚地看出它们的关系:
able 3. Summary of allowed NAL unit types for each packetization
mode (yes = allowed, no = disallowed, ig = ignore)
Type Packet Single NAL Non-Interleaved Interleaved
Unit Mode Mode Mode
-------------------------------------------------------------
0 undefined ig ig ig
1-23 NAL unit yes ye陪护费 s no
24 STAP-A no yes no
25 STAP-B no no yes
26 MTAP16 no no yes
27 MTAP24 no no yes
28 FU-A no yes yes
29 FU-B no no yes
30-31 undefined ig ig ig

re: H.264 RTP payload 格式 2010-07-20 10:21
⾮常感谢楼上的回答
re: H.264 RTP payload 格式 2010-07-20 11:13
// 如果⼀个 NALU ⼤于最⼤的 RTP 包的⼤⼩, 则需要把它进⾏分⽚后打包发送
BYTE buffer[1500];
BYTE nalHeader = sliceData[0]; // NALU
BYTE* data = sliceData + 1;
int leftover = sliceSize - 1;
BOOL isStart = TRUE;
while (leftover > 0) {
int size = MIN(1350, leftover);
isEnd = (size == leftover);
问⼀个问题,楼上程序中的int size = MIN(1350, leftover); 应该是
int size = MAX(1350, leftover); 呢还是MIN,我感觉是MAX,谢谢楼主。

re: H.264 RTP payload 格式[未登录] 2011-05-18 23:23
@暗⿊长⽼
PTStimestamp怎么设定的??
re: H.264 RTP payload 格式 2012-07-05 10:19

肯定是MIN
@sc

re: H.264 RTP payload 格式 2013-02-25 17:34
没有看到source code,能share下吗?
re: H.264 RTP payload 格式 2013-03-08 11:26
这篇⽜
贼清楚啦~~~


本文发布于:2023-04-17 19:17:39,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/834617.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:如何自我管理
下一篇:纸币是货币吗
标签:fmtp
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图