H.264 RTP PAYLOAD 格式
转自http://www.cppblog.com/czanyou/archive/2009/12/25/67940.html
H.264 视频 RTP 负载格式
1. 网络抽象层单元类型 (NALU)
NALU 头由一个字节组成, 它的语法如下:
F: 1 个比特.
NRI: 2 个比特.
这个属性.
Type: 5 个比特.
2. 打包模式
2.1 单一 NAL 单元模式
NALU 单元的开始, 必须是 "00 00 00 01" 或 "00 00 01", NALU 头仅一个字节, 其后都是 NALU 单元内容.
2.2 组合封包模式
2.3 Fragmentation Units (FUs).
3. SDP 参数
3.1 packetization-mode:
3.2 sprop-parameter-sets:
3.3 profile-level-id:
三个字节表示 H.264 的 Profile 级别:
3.4 max-mbps:
Feedback
# re: H.264 RTP payload 格式 2009-12-25 17:17 heshui
辛苦啦。
在组合封包时,NALU 1 Size前面没有提到,它是属于NALU payload吧。也就是说h264的 NALU payload = NALU payload size + NALU payload 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 heshui
@暗黑长老
楼主能不能再给我一个分片封包的实际例子,就是说如果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 heshui
前几天不小心把水泼到本本上,没能即时观注楼主的回复,换了块主板,嘿嘿。
代码很详细,看了例子很清淅。
谢谢楼主多次回复:) 回复 更多评论
# re: H.264 RTP payload 格式 2010-01-29 09:11 asd
# re: H.264 RTP payload 格式 2010-02-09 10:49 Marc
# re: H.264 RTP payload 格式 2010-04-26 08:32 喃喃
非常感谢你,正在研究流媒体,听老牛们说,学这个协议比较好。 回复 更多评论
# re: H.264 RTP payload 格式 2010-07-09 14:33 winston
你是在哪个城市的,方便留个电话什么的联系方式,我们这边有个流媒体相关的项目,寻求工程师合作开发。我邮箱是:message.winston@gmail.com 回复 更多评论
# re: H.264 RTP payload 格式 2010-07-14 10:21 sc
请教个问题,H.264的RTP发送中三种模式(单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 yes 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 sc
# re: H.264 RTP payload 格式 2010-07-20 11:13 sc
// 如果一个 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 随心
@暗黑长老
PTS跟timestamp怎么设定的?? 回复 更多评论
# re: H.264 RTP payload 格式 2012-07-05 10:19 童爱玲
# re: H.264 RTP payload 格式 2013-02-25 17:34 hiber
没有看到source code,能share下吗? 回复 更多评论