当前位置: 技术问答>linux和unix
如何识别一个数据包是视频数据包
来源: 互联网 发布时间:2016-08-03
本文导语: 用ethereal捕获本机的数据包,但如何判断是不是视频数据包呢? 有些流媒体传输时采用了rtp/rtcp协议,可以从协议上判断是视频(或音频)数据包;但有些可以传输时直接使用了http协议,或者直接使用了udp协议,...
用ethereal捕获本机的数据包,但如何判断是不是视频数据包呢?
有些流媒体传输时采用了rtp/rtcp协议,可以从协议上判断是视频(或音频)数据包;但有些可以传输时直接使用了http协议,或者直接使用了udp协议,遇到这种情况,该如何判断是否为视频数据包?
我的想法:找出现有的视频数据压缩格式(如AVI、MPEG-4、H.23X)的关键字,根据这些关键字进行匹配,但这些压缩格式有关键字吗?那这些关键字到底是什么呢?
谢谢!
有些流媒体传输时采用了rtp/rtcp协议,可以从协议上判断是视频(或音频)数据包;但有些可以传输时直接使用了http协议,或者直接使用了udp协议,遇到这种情况,该如何判断是否为视频数据包?
我的想法:找出现有的视频数据压缩格式(如AVI、MPEG-4、H.23X)的关键字,根据这些关键字进行匹配,但这些压缩格式有关键字吗?那这些关键字到底是什么呢?
谢谢!
|
除去RTP的头之后,如果是个视频包, 前4个byte(假设指针为pbuffer)就会有它的编码信息, 后四个byte是I帧和P帧的信息.
给你看几行代码:
if((pbuffer & 0x3fcffff) == 0x2800000 ) { //decode H263 bit stream
////H263
}else{
////MPEG-4
}
.....
if((((pbuffer & 0x3fcffff) == 0x2800000)&&(((pbuffer+4) & 0x2) == 0x2/*not I-frame?*/))||(head_mpeg_h263 == 0xb6010000)) {//the frame is a P-frame of H263 or a I/P-frame of mpeg
{
//////////P 帧
}else if((((pbuffer & 0x3fcffff) == 0x2800000)&&(((pbuffer+4) & 0x2) == 0)/* I-frame?*/)||(pbuffer == 0x00010000)) {
/////////I帧
给你看几行代码:
if((pbuffer & 0x3fcffff) == 0x2800000 ) { //decode H263 bit stream
////H263
}else{
////MPEG-4
}
.....
if((((pbuffer & 0x3fcffff) == 0x2800000)&&(((pbuffer+4) & 0x2) == 0x2/*not I-frame?*/))||(head_mpeg_h263 == 0xb6010000)) {//the frame is a P-frame of H263 or a I/P-frame of mpeg
{
//////////P 帧
}else if((((pbuffer & 0x3fcffff) == 0x2800000)&&(((pbuffer+4) & 0x2) == 0)/* I-frame?*/)||(pbuffer == 0x00010000)) {
/////////I帧