private async void HandleConnect(IChannelHandlerContext ctx, RtmpCommandMessage msg) { logger.Info($"client connect {msg} "); var command = ((Dictionary <string, object>)msg.Command[2]); var app = command.GetValueOrDefault("app").ToString(); var clientRequestEncode = command.GetValueOrDefault("objectEncoding"); if (!string.Equals(app, RtmpConfig.Instance.App, StringComparison.OrdinalIgnoreCase)) { await ctx.CloseAsync(); return; } if (clientRequestEncode != null && clientRequestEncode.ToString() == "3") { logger.Error($"client :{ctx} request AMF3 encoding server doesn't support"); await ctx.CloseAsync(); return; } _streamName = new StreamName(app, null, false); int ackSize = 5000000; WindowAcknowledgementSize was = new WindowAcknowledgementSize(ackSize); var spb = new SetPeerBandWidth(ackSize, Constants.SET_PEER_BANDWIDTH_TYPE_SOFT); SetChunkSize setChunkSize = new SetChunkSize(5000); await ctx.WriteAndFlushAsync(was); await ctx.WriteAndFlushAsync(spb); await ctx.WriteAndFlushAsync(setChunkSize); var result = new List <Object>(); result.Add("_result"); result.Add(msg.Command[1]); // transaction id result.Add(new AMF0Object().AddProperty("fmsVer", "FMS/3,0,1,123").AddProperty("capabilities", 31)); result.Add(new AMF0Object().AddProperty("level", "status").AddProperty("code", "NetConnection.Connect.Success") .AddProperty("description", "Connection succeeded").AddProperty("objectEncoding", 0)); RtmpCommandMessage response = new RtmpCommandMessage(result); await ctx.WriteAndFlushAsync(response); }
public static AbstractRtmpMessage Decode(RtmpHeader header, IByteBuffer payload) { AbstractRtmpMessage result = null; short messageTypeId = header.MessageTypeId; switch (messageTypeId) { case Constants.MSG_SET_CHUNK_SIZE: { int readInt = payload.ReadInt(); SetChunkSize setChunkSize = new SetChunkSize(); setChunkSize.ChunkSize = readInt; result = setChunkSize; } break; case Constants.MSG_ABORT_MESSAGE: { int csid = payload.ReadInt(); Abort abort = new Abort(csid); result = abort; } break; case Constants.MSG_ACKNOWLEDGEMENT: { int ack = payload.ReadInt(); result = new Acknowledgement(ack); } break; case Constants.MSG_WINDOW_ACKNOWLEDGEMENT_SIZE: { int size = payload.ReadInt(); result = new WindowAcknowledgementSize(size); } break; case Constants.MSG_SET_PEER_BANDWIDTH: { int ackSize = payload.ReadInt(); int type = payload.ReadByte(); result = new SetPeerBandWidth(ackSize, type); } break; case Constants.MSG_TYPE_COMMAND_AMF0: { List <Object> decode = AMF0.DecodeAll(payload); result = new RtmpCommandMessage(decode); } break; case Constants.MSG_USER_CONTROL_MESSAGE_EVENTS: { short readShort = payload.ReadShort(); int data = payload.ReadInt(); result = new UserControlMessageEvent(readShort, data); } break; case Constants.MSG_TYPE_AUDIO_MESSAGE: { AudioMessage am = new AudioMessage(); byte[] data = ReadAll(payload); am.AudioData = data; if (header.Fmt == Constants.CHUNK_FMT_0) { am.Timestamp = header.Timestamp; } else if (header.Fmt == Constants.CHUNK_FMT_1 || header.Fmt == Constants.CHUNK_FMT_2) { am.TimestampDelta = header.TimestampDelta; } result = am; } break; case Constants.MSG_TYPE_VIDEO_MESSAGE: { VideoMessage vm = new VideoMessage(); byte[] data = ReadAll(payload); vm.VideoData = data; if (header.Fmt == Constants.CHUNK_FMT_0) { vm.Timestamp = header.Timestamp; } else if (header.Fmt == Constants.CHUNK_FMT_1 || header.Fmt == Constants.CHUNK_FMT_2) { vm.TimestampDelta = header.TimestampDelta; } result = vm; } break; case Constants.MSG_TYPE_DATA_MESSAGE_AMF0: { result = new RtmpDataMessage(AMF0.DecodeAll(payload)); } break; default: break; } if (result != null) { result.InboundBodyLength = header.MessageLength; result.InboundHeaderLength = header.HeaderLength; return(result); } else { return(null); } }