Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
 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();
 }