private void TiandyRealDataCallbackFunc(int playfd, int datatype, byte[] buf, uint size, int usr)
{
NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log);
string cameraNo = null;
try
{
StreamType streamType = StreamType.VIDEO_H264;
//判断码流类型,因为码流回调访问频频非常高,不单独抽成一个方法,减少方法访问开销
//对于支持的码流类型,用break退出switch,对于不支持的码流类型直接舍弃,用return返回
switch (datatype)
{
case (int)TiandyStreamType.STREAM_TYPE_VIDEO_FRAME_I:
streamType = StreamType.VIDEO_H264;
break;
case (int)TiandyStreamType.STREAM_TYPE_VIDEO_FRAME_P:
streamType = StreamType.VIDEO_H264;
break;
case (int)TiandyStreamType.STREAM_TYPE_VIDEO_FRAME_B:
streamType = StreamType.VIDEO_H264;
break;
//音频只接收G711A和G711U,其他舍弃
case (int)TiandyStreamType.STREAM_TYPE_AUDIO_G711A:
streamType = StreamType.AUDIO_G711A;
break;
case (int)TiandyStreamType.STREAM_TYPE_AUDIO_G711U:
streamType = StreamType.AUDIO_G711U;
break;
default:
//不支持的类型直接舍弃,返回
//logEx.Warn("This stream type is not support. Chuck the data.StreamType:{0};Camera no:{1}", datatype, cameraNo);
return;
}
if (this.handelOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME))
{
try
{
if (!this.videoHandleCameraDic.ContainsKey(playfd))
{
logEx.Error("The video data handle is not found.Handle:{0}", playfd);
return;
}
cameraNo = this.videoHandleCameraDic[playfd];
if (string.IsNullOrEmpty(cameraNo))
{
return;
}
}
finally
{
this.handelOperateLock.ExitReadLock();
}
}
if (streamType == StreamType.AUDIO_G711A || streamType == StreamType.AUDIO_G711U)
{
//如果是音频流,需要判断mic的状态,开启时才发送音频流
if (this.micOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME))
{
try
{
if (this.cameraMicStatusDic.ContainsKey(cameraNo))
{
//如果mic为非开启状态,则不发送音频码流,
if (!this.cameraMicStatusDic[cameraNo])
{
//logEx.Warn("This data is audio,but the mic is off.Chuck the data.Camera no:{0}", cameraNo);
return;
}
}
else
{
//默认为关闭状态,因此如果cameraMicStatusDic不包含该摄像头,则认为处于关闭状态,舍弃音频码流
//logEx.Warn("This data is audio,but the mic is off.Chuck the data.Camera no:{0}", cameraNo);
return;
}
}
finally
{
this.micOperateLock.ExitReadLock();
}
}
}
MediaData mediaData = new MediaData();
mediaData.Data = buf;
mediaData.DataType = MediaDataType.FRAME_DATA;
mediaData.StreamType = streamType;
mediaData.Size = size;
//向回调函数转发码流
this.dataCallBack(cameraNo, mediaData, sender);
}
catch (Exception e)
{
logEx.Error("Send the media data failed.The camera No is {0}.Execption message:{1}", cameraNo, e.Message);
}
}