RTP发送H264图像发灰解决方法

使用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)