public override void Dispose() { switch (_state) { case State.Publishing: _publisher.Dispose(); //Handler.UnpublishStream(Peer,_index,Name); break; case State.Playing: _listener.Dispose(); //Handler.UnsubscribeStream(Peer, _index, Name); break; } _listener = null; _state = State.Idle; }
protected override void MessageHandler(string action, Variant param) { this.Log().Info("{0},{1}", Id, action); switch (action) { case "play": Dispose(); Name = param[1]; double start = param[2] ?? -2000; double length = param[3] ?? -1000; try { _listener = Handler.SubScribeStream(Peer, StreamId, Name, Writer, start, length); _state = State.Playing; } catch (Exception ex) { Logger.ASSERT("{0}", ex); } var raw = Writer.WriterRawMessage(); raw.Write((ushort)0); raw.Write(3); raw.Write(34); Writer.Flush(true); break; case "closeStream": Dispose(); break; case "publish": Dispose(); Name = param[1]; var type = param[2] ?? "live"; //if (message.Available) //{ // type = message.Read<string>(); //} _publisher = Handler.PublishStream(Peer, StreamId, Name, type, Writer); if (_publisher != null) { _state = State.Publishing; } break; case "receiveAudio": if (_listener != null) { _listener.ReceiveAudio = param[1]; } break; case "receiveVideo": if (_listener != null) { _listener.ReceiveVideo = param[1]; } break; case "onStatus": var obj = param[1]; this.Log().Info(obj["code"]); OnStatus?.Invoke(param); break; default: if (_state == State.Publishing) { //var streamMessage = Variant.Get(); //var pos = message.BaseStream.Position; //streamMessage[Defines.RM_FLEXSTREAMSEND, Defines.RM_FLEXSTREAMSEND_UNKNOWNBYTE] = 0; //streamMessage[Defines.RM_FLEXSTREAMSEND, Defines.RM_FLEXSTREAMSEND_PARAMS] = Variant.Get(); //streamMessage[Defines.RM_FLEXSTREAMSEND, Defines.RM_FLEXSTREAMSEND_PARAMS].Add(action); //while (message.Available) //{ // streamMessage[Defines.RM_FLEXSTREAMSEND, Defines.RM_FLEXSTREAMSEND_PARAMS].Add(message.ReadVariant()); //} using (var tempms = Utils.Rms.GetStream()) { tempms.WriteByte(0); tempms.WriteByte(AMF0Serializer.AMF0_SHORT_STRING); var buffer = Encoding.UTF8.GetBytes(action); tempms.Write((ushort)buffer.Length); tempms.Write(buffer, 0, buffer.Length); //message.BaseStream.Position = pos; //////////message.BaseStream.CopyTo(tempms); tempms.Position = 0; _publisher.SendStreamMessage(new BufferWithOffset(tempms)); //Handler.SendStreamMessage(); } } else { base.MessageHandler(action, param); } break; } }
public override OutNetRtmfpStream SubScribeStream(Peer peer, uint id, string name, FlowWriter writer, double start, double length) { var session = writer.Band as Session; var outNetRtmfpStream = new OutNetRtmfpStream(session, session.Application.StreamsManager, id, name) { Writer = writer, Unbuffered = start == -3000 }; outNetRtmfpStream.Init(); var inBoundStream = session.Application.StreamsManager.FindByTypeByName(StreamTypes.ST_IN_NET, name, true, false).Select(x => x.Value).OfType <IInStream>().FirstOrDefault(); switch ((int)start) { case -2000: if (inBoundStream != null) { inBoundStream.Link(outNetRtmfpStream); } else { goto default; } break; case -1000: if (inBoundStream != null) { inBoundStream.Link(outNetRtmfpStream); } else { goto case -999; } break; case -999: if (ClientApplicationManager.ClusterApplication != null) { ClientApplicationManager.ClusterApplication.GetProtocolHandler <BaseClusterAppProtocolHandler>().PlayStream(session.Application.Id, name); } break; default: var metadata = session.Application.StreamsManager.GetMetaData(name, true, session.Application.Configuration); var pRtmpInFileStream = InFileRTMPStream.GetInstance(session, session.Application.StreamsManager, metadata); if (pRtmpInFileStream == null) { WARN("Unable to get file stream. Metadata:\n{0}", metadata.ToString()); goto case -999; } if (!pRtmpInFileStream.Initialize(metadata[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER])) { WARN("Unable to initialize file inbound stream"); pRtmpInFileStream.Dispose(); goto case -999; } if (!pRtmpInFileStream.Link(outNetRtmfpStream)) { goto case -999; } if (!pRtmpInFileStream.Play(start, length)) { FATAL("Unable to start the playback"); goto case -999; } break; } return(outNetRtmfpStream); }