视频直播一般使用MP2T(ISO/IEC 13818-1,MPEG-TS)协议, 具体有如下几种:
常用的是MP2T/RTP/UDP和MP2T/ UDP,主要是直播视频不需要重传。
每7个MP2T包打包为一个RTP,然后每个RTP再打包为一个UDP。或者每7个MP2T包也可以直接打包为一个UDP。(由信令决定TS所属的UDP端口号)。
如果视频速率传输方式是CBR(const bit rate),如果实际视频源压缩比较高或者P帧,则填充无有效载荷的包。注: VBR(variable bit rate)
MP2T包:PDU 188B(含头),头部4B,头部字段如下:
sync_byte 同步字节,固定为0x47 ,表示后面的是一个TS分组,包中数据是不会出现0x47
transport_error_indicator传输错误标志位,一般传输错误的话就不会处理这个包了
payload_unit_start_indicator这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同
transport_priority 传输优先级位,1表示高优先级,传输机制可能用到,解码好像用不着。
PID指出了这个包的有效负载数据的类型,音频 或 视频 或者 播放目录。
transport_scrambling_control加密标志位,表示TS分组有效负载的加密模式。TS分组首部(也就是前面这32bit)是不应被加密的,00表示未加密。
adaption_field_control 翻译为“调整字段控制”,表示TS分组首部后面是否跟随有调整字段和有效负载。01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00的话解码器不进行处理。空分组没有调整字段
continuity_counter 一个4bit的计数器,范围0-15,具有相同的PID的TS分组传输时每次加1,到15后清0。不过,有些情况下是不计数的。如下:(1)TS分组无有效负载(2)复制的TS分组和原分组这个值一样(3)标志discontinuity_indicator为1时
adaptation_field()调整字段的处理
二、 视频丢帧分析
1、 如果UDP上面直接是mp2t包(ISO/IEC的包),过滤UDP视频流
输入过滤表达式 udp.stream==流号,保存(File->Export Specified Packets)。
2、 如果是UDP上面是RTP,需要先把data解码设置为RTP解码
3、 UDP视频流丢帧分析
查看wireshark诊断信息(Analyze->Expert Info), Error中是否有Malform MP2T信息。
丢帧判断依据: 相同PID的连续号CC在[0,15] 循环,不连续则为丢帧。如有丢帧,查看对应(最靠近视频udp层)的ip层,ip.id是否连续。
[ip.id连续] 摄像头视频源导致丢帧
[ip.id不连续] 最有可能为丢包导致丢帧,但要排除以下2点导致的id不连续的因素
4、 UDP视频流抖动分析
查看IO统计信息(Statistics->IO Graph), 输出每ms/s的速率,发包间隔。
输出ms/s级速率(点copy)
输出发包间隔
对ms级速率从1一直编号,刷选速率非0项,编号前后相减,即为间隔(单位ms)
5、 输出非0项的发包间隔和速率的均值(average),偏差(stdev),最大值(max)
6、 还原UDP/MP2T视频
选择一个UDP/MP2T视频流,Analyze->Follow UDP Stream,
选择视频数据的方向,保存为Raw的数据,并命名为.ts的文件。
另新版wireshark显示如下:
7、 播放视频
如果视频分辨率比较高,本机可能无法播放。
用VLC或Potplayer视频播放器播放,就可以看到这个视频流的表现效果了。
I帧数据 155KB
P帧数据 24KB