private void HandlerMessage(Stream message,bool needDispose = true)
{
var type = message.ReadByte();
AMF0Reader amf = new AMF0Reader(message);
switch (type)
{
case Defines.RM_HEADER_MESSAGETYPE_INVOKE:
case Defines.RM_HEADER_MESSAGETYPE_FLEX:
case Defines.RM_HEADER_MESSAGETYPE_FLEXSTREAMSEND:
amf._ReadUInt32();//skip timestamp
goto default;
case Defines.RM_HEADER_MESSAGETYPE_VIDEODATA:
VideoHandler(message);
break;
case Defines.RM_HEADER_MESSAGETYPE_AUDIODATA:
AudioHandler(message);
break;
case Defines.RM_HEADER_MESSAGETYPE_CHUNKSIZE:
RawHandler(1, message);
break;
case Defines.RM_HEADER_MESSAGETYPE_USRCTRL:
amf._ReadUInt32();//skip timestamp
var usrCtrlType = amf.ReadUInt16();
switch (usrCtrlType)
{
case 0x29:
var keepAliveServer = amf.ReadUInt32();
var keepAlivePeer = amf.ReadUInt32();
Logger.Debug("keepAliveServer:{0},keepAlivePeer:{1}", keepAliveServer, keepAlivePeer);
Band.KeepAliveServer = keepAliveServer;
break;
case 0x22:
var syncID = amf.ReadUInt32();
var count = amf.ReadUInt32();
if (Band.FlowSynchronization.ContainsKey(syncID))
{
if (Band.FlowSynchronization[syncID].Count + 1 == count)
{
foreach (var flow in Band.FlowSynchronization[syncID])
flow.SyncDone();
Band.FlowSynchronization[syncID].Clear();
}
else
{
Band.FlowSynchronization[syncID].Add(this);
IsWaitingSync = true;
}
}
else
{
Band.FlowSynchronization[syncID] = new HashSet<Flow> {this};
IsWaitingSync = true;
}
//Logger.Debug("syncID:{0},count:{1}", syncID, count);
break;
}
break;
default:
try
{
var messageBody = RtmpProtocolSerializer.Deserialize(type, amf);
switch (type)
{
case Defines.RM_HEADER_MESSAGETYPE_INVOKE:
case Defines.RM_HEADER_MESSAGETYPE_FLEX:
string functionName = messageBody[Defines.RM_INVOKE, Defines.RM_INVOKE_FUNCTION];
Writer.CallbackHandle = messageBody[Defines.RM_INVOKE, Defines.RM_INVOKE_ID];
MessageHandler(functionName, messageBody[Defines.RM_INVOKE, Defines.RM_INVOKE_PARAMS]);
break;
case Defines.RM_HEADER_MESSAGETYPE_NOTIFY:
case Defines.RM_HEADER_MESSAGETYPE_FLEXSTREAMSEND:
break;
default:
Logger.WARN("type:{0}\r\n{1}", type, messageBody.ToString());
break;
}
}
catch (Exception)
{
//do nothing
}
break;
}
Writer.CallbackHandle = 0;
if(needDispose) message.Dispose();
}
public void SyncDone()