public void SendVideoData(MediaData mediaData, string sender)
{
//对于H264的帧数据,如果监控平台回调的码流,SPS PPS IDR是分开发送的,则需要进行拼帧处理,将SPS+PPS+IDR拼接在一起发送
if (mediaData.DataType == MediaDataType.FRAME_DATA)
{
switch (mediaData.FrameType)
{
case FrameDataType.H264_SEI_NALU_TYPE:
//SEI的包,直接丢弃
return;
case FrameDataType.H264_SPS_NALU_TYPE:
//SPS的类型,先清空缓存
//this.CacheData = new byte[mediaData.Size];
//将SPS的数据缓存
this.CacheData = mediaData.Data;
this.LastCacheFrameType = mediaData.FrameType;
//直接return,暂不发送
return;
case FrameDataType.H264_PPS_NALU_TYPE:
//如果缓存最后一帧数据不为SPS或者PPS,说明数据乱序,舍弃。
if ((this.LastCacheFrameType != FrameDataType.H264_SPS_NALU_TYPE) && (this.LastCacheFrameType != FrameDataType.H264_PPS_NALU_TYPE))
{
return;
}
//将PPS的数据缓存,暂不发送
byte[] byteTemp = new byte[this.CacheData.Length + mediaData.Data.Length];
this.CacheData.CopyTo(byteTemp, 0);
mediaData.Data.CopyTo(byteTemp, this.CacheData.Length);
this.CacheData = byteTemp;
this.LastCacheFrameType = mediaData.FrameType;
//直接return,暂不发送
return;
case FrameDataType.H264_IDR_NALU_TYPE:
//如果缓存是上最后一帧数据不为PPS,说明数据乱序,舍弃
if (this.LastCacheFrameType != FrameDataType.H264_PPS_NALU_TYPE)
{
return;
}
byteTemp = new byte[this.CacheData.Length + mediaData.Data.Length];
this.CacheData.CopyTo(byteTemp, 0);
mediaData.Data.CopyTo(byteTemp, this.CacheData.Length);
mediaData.Data = byteTemp;
mediaData.Size = (uint)mediaData.Data.Length;
//break跳出 switch,进行发送
break;
default:
//其他类型的数据,直接发送
break;
}
}
this.DataCallBack(this.CameraNo, mediaData, sender);
}