硬件平台:海思 3515 自己写的RTP打包程序。
使用RTP打包发送按包获取的编码码流, 如果是静态图像,图像就发灰(类似图片的会灰阶处理一样),如果图像是运动的,那么图片色彩正常。经测试和I帧有关。比如,现在帧率是25,I帧间隔是100.那么每四秒会出现一次刷新(图像变灰,一直持续)。经过好心人帮助得知这是 I帧丢失造成的。经过抓包分析果然丢失了一个字节的数据!!下面是分析:
下图是好心人发给我的一个H264文件分析的程序界面:
下图是抓包工具的截图:
这两个是一个数据源。
首先看第一个NALU
(来自h264文件数据分析)00 00 00 01 67 42 E0 1E DB 02 C0 49 10
此数据00 00 00 01是h264的起始码 67开始往后就是NALU数据 其中67是NALU头(7表示此NALU的type为ssp) 后面的全是载荷数据 RBSP
抓包工具显示:80 e0 00 00 00 00 0e 10 00 00 00 0a 67 42 e0 1e db 02 c0 49 10
数据分析如下:
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
e0: RTP头部分 ,M(1位),PT(7位)
00 00: RTP头部分 ,序号
00 00 0e 10: RTP头部分 ,时间戳
00 00 00 0a: RTP头部分 ,ssrc
67:NALU头( 由于数据长度小于每包发送的长度(1400)此处就是NALU除去起始码的第一个字节)
42 e0 1e db 02 c0 49 10 :RBSP
再看第二个NALU
(来自h264文件数据分析) 00 00 00 01 68 CE 30 A4 80
此数据00 00 00 01是h264的起始码 68开始往后就是NALU数据 其中68是NALU头(8表示此NALU 的type 是pps) 后面的全是载荷数据 RBSP
抓包工具显示: 80 e0 00 01 00 00 1c 20 00 00 00 0a 68 ce 30 a4 80
数据分析如下:
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
e0: RTP头部分 ,M(1位),PT(7位)
00 01: RTP头部分 ,序号
00 00 1c 20: RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
68:NALU头(由于数据长度小于每包发送的长度(1400)此处就是NALU除去起始码的第一个字节)
ce 30 a4 80 :RBSP
再看第三个NALU
(来自h264文件数据分析)00 00 00 01 06 E5 01 72 80
此数据00 00 00 01是h264的起始码 06开始往后就是NALU数据 其中06是NALU头(6表示此NALU 的type 是SEI) 后面的全是载荷数据 RBSP
抓包工具显示:80 e0 00 02 00 00 2a 30 00 00 00 0a 06 e5 01 72 80
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
e0: RTP头部分 ,M(1位),PT(7位)
00 02: RTP头部分 ,序号
00 00 2a 30: RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
06:NALU头(由于数据长度小于每包发送的长度(1400)此处就是NALU除去起始码的第一个字节)
e5 01 72 80 :RBSP
再看第四个NALU
(来自h264文件数据分析)00 00 00 01 65 B8 00 00 AC 5E 04 45 0A C6 A2 39 。。。。。共18942字节
此数据00 00 00 01是h264的起始码 65开始往后就是NALU数据 其中65是NALU头(5表示此NALU 的type 是IDR(I帧)) 后面的全是载荷数据 RBSP
抓包工具显示: 80 60 00 03 00 00 38 40 00 00 00 0a 7c 81 b8 00 00 ac 5e 04 45 0a c6 a2 39 。。。。
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
60: RTP头部分 ,M(1位),PT(7位)
00 03: RTP头部分 ,序号
00 00 38 40 : RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
7c :FU_INDICATOR(由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_INDICATOR )
81:FU_HEADER (由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_HEADER )
b8 00 00 ac 5e 04 45 0a c6 a2 39 。。。。 :RBSP
再看第五个NALU
(来自h264文件数据分析) 00 00 00 01 61 E2 31 42 B7 08 4D 8E A3 48 39 B6。。。共4424字节
此数据00 00 00 01是h264的起始码 61开始往后就是NALU数据 其中61是NALU头(5表示此NALU 的type 是IDR) 后面的全是载荷数据 RBSP
抓包工具显示:80 60 00 11 00 00 46 50 00 00 00 0a 7c 81 e2 31 42 b7 08 4d 8e a3 48 39 b6 。。。
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
60: RTP头部分 ,M(1位),PT(7位)
00 11: RTP头部分 ,序号
00 00 46 50 : RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
7c :FU_INDICATOR(由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_INDICATOR )
81:FU_HEADER (由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_HEADER )
e2 31 42 b7 08 4d 8e a3 48 39 b6 。。。 :RBSP
使用RTP打包发送按包获取的编码码流, 如果是静态图像,图像就发灰(类似图片的会灰阶处理一样),如果图像是运动的,那么图片色彩正常。经测试和I帧有关。比如,现在帧率是25,I帧间隔是100.那么每四秒会出现一次刷新(图像变灰,一直持续)。经过好心人帮助得知这是 I帧丢失造成的。经过抓包分析果然丢失了一个字节的数据!!下面是分析:
下图是好心人发给我的一个H264文件分析的程序界面:
这两个是一个数据源。
首先看第一个NALU
(来自h264文件数据分析)00 00 00 01 67 42 E0 1E DB 02 C0 49 10
此数据00 00 00 01是h264的起始码 67开始往后就是NALU数据 其中67是NALU头(7表示此NALU的type为ssp) 后面的全是载荷数据 RBSP
抓包工具显示:80 e0 00 00 00 00 0e 10 00 00 00 0a 67 42 e0 1e db 02 c0 49 10
数据分析如下:
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
e0: RTP头部分 ,M(1位),PT(7位)
00 00: RTP头部分 ,序号
00 00 0e 10: RTP头部分 ,时间戳
00 00 00 0a: RTP头部分 ,ssrc
67:NALU头( 由于数据长度小于每包发送的长度(1400)此处就是NALU除去起始码的第一个字节)
42 e0 1e db 02 c0 49 10 :RBSP
再看第二个NALU
(来自h264文件数据分析) 00 00 00 01 68 CE 30 A4 80
此数据00 00 00 01是h264的起始码 68开始往后就是NALU数据 其中68是NALU头(8表示此NALU 的type 是pps) 后面的全是载荷数据 RBSP
抓包工具显示:
数据分析如下:
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
e0: RTP头部分 ,M(1位),PT(7位)
00 01: RTP头部分 ,序号
00 00 1c 20: RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
68:NALU头(由于数据长度小于每包发送的长度(1400)此处就是NALU除去起始码的第一个字节)
ce 30 a4 80 :RBSP
再看第三个NALU
(来自h264文件数据分析)00 00 00 01 06 E5 01 72 80
此数据00 00 00 01是h264的起始码 06开始往后就是NALU数据 其中06是NALU头(6表示此NALU 的type 是SEI) 后面的全是载荷数据 RBSP
抓包工具显示:80 e0 00 02 00 00 2a 30 00 00 00 0a 06 e5 01 72 80
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
e0: RTP头部分 ,M(1位),PT(7位)
00 02: RTP头部分 ,序号
00 00 2a 30: RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
06:NALU头(由于数据长度小于每包发送的长度(1400)此处就是NALU除去起始码的第一个字节)
e5 01 72 80 :RBSP
再看第四个NALU
(来自h264文件数据分析)00 00 00 01 65 B8 00 00 AC 5E 04 45 0A C6 A2 39 。。。。。共18942字节
此数据00 00 00 01是h264的起始码 65开始往后就是NALU数据 其中65是NALU头(5表示此NALU 的type 是IDR(I帧)) 后面的全是载荷数据 RBSP
抓包工具显示: 80 60 00 03 00 00 38 40 00 00 00 0a 7c 81 b8 00 00 ac 5e 04 45 0a c6 a2 39 。。。。
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
60: RTP头部分 ,M(1位),PT(7位)
00 03: RTP头部分 ,序号
00 00 38 40 : RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
7c :FU_INDICATOR(由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_INDICATOR )
81:FU_HEADER (由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_HEADER )
b8 00 00 ac 5e 04 45 0a c6 a2 39 。。。。 :RBSP
再看第五个NALU
(来自h264文件数据分析) 00 00 00 01 61 E2 31 42 B7 08 4D 8E A3 48 39 B6。。。共4424字节
此数据00 00 00 01是h264的起始码 61开始往后就是NALU数据 其中61是NALU头(5表示此NALU 的type 是IDR) 后面的全是载荷数据 RBSP
抓包工具显示:80 60 00 11 00 00 46 50 00 00 00 0a 7c 81 e2 31 42 b7 08 4d 8e a3 48 39 b6 。。。
80:RTP头部分,包含 V(2位),P(1位),,X(1位),CC(5位)
60: RTP头部分 ,M(1位),PT(7位)
00 11: RTP头部分 ,序号
00 00 46 50 : RTP头部分 ,时间戳(此时间戳与上一时间戳差值为3600 =90000/25)
00 00 00 0a: RTP头部分 ,ssrc
7c :FU_INDICATOR(由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_INDICATOR )
81:FU_HEADER (由于数据长度大于每包发送的长度(1400)此处就是拆包发送需要加上 FU_HEADER )
e2 31 42 b7 08 4d 8e a3 48 39 b6 。。。 :RBSP