基于RTP的H264视频数据打包解包类
来源:互联网 发布:电脑证件照软件 编辑:程序博客网 时间:2024/05/29 14:59
最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包、解包的文档和代码。功夫不负有心人,找到不少有价值的文档和代码。参考这些资料,写了H264RTP打包类、解包类,实现了单个NAL单元包和FU_A分片单元包。对于丢包处理,采用简单的策略:丢弃随后的所有数据包,直到收到关键帧。测试效果还不错,代码贴上来,若能为同道中人借鉴一二,足矣。两个类的使用说明如下(省略了错误处理过程):
DWORD H264SSRC;
CH264_RTP_PACK pack ( H264SSRC ) ;
BYTE *pVideoData ;
DWORD Size, ts ;
bool IsEndOfFrame ;
WORD wLen ;
pack.Set ( pVideoData, Size, ts, IsEndOfFrame );
BYTE *pPacket ;
while ( pPacket = pack.Get (&wLen ) )
{
// rtp packet process
// ...
}
HRESULT hr ;
CH264_RTP_UNPACK unpack (hr ) ;
BYTE *pRtpData;
WORDinSize;
int outSize;
BYTE *pFrame =unpack.Parse_RTP_Packet ( pRtpData, inSize,&outSize ) ;
if ( pFrame !=NULL )
{
// frameprocess
//...
}
// class CH264_RTP_PACK start
class CH264_RTP_PACK
{
#defineRTP_VERSION 2
typedefstruct NAL_msg_s
{
bool eoFrame ;
unsigned chartype; // NAL type
unsigned char*start; //pointer to first location in the send buffer
unsigned char*end; //pointer to last location in send buffer
unsigned long size ;
}NAL_MSG_t;
typedefstruct
{
//LITTLE_ENDIAN
unsignedshort cc:4;
unsignedshort x:1;
unsignedshort p:1;
unsignedshort v:2;
unsignedshort pt:7;
unsignedshort m:1;
unsignedshort seq;
unsignedlong ts;
unsignedlong ssrc;
}rtp_hdr_t;
typedefstruct tagRTP_INFO
{
NAL_MSG_t nal; // NAL information
rtp_hdr_t rtp_hdr; // RTP header is assembled here
int hdr_len; // length of RTP header