private async void HandleCloseStream(IChannelHandlerContext ctx, RtmpCommandMessage msg) { MediaStream stream = _mediaStreamDic.GetValueOrDefault(_streamName); try { if (_tag == RtmpTag.Subscriber) { logger.Info($"subscriber:{ctx.Channel.RemoteAddress} close"); return; } var onStatus = OnStatus("status", "NetStream.Unpublish.Success", "Stop publishing"); await ctx.WriteAsync(onStatus); if (stream == null) { logger.Error($"can't find stream:{nameof(_streamName)} in buffer queue"); } else { if (stream != null) { await stream.SendEofToAllSubscriberAndClose(); _mediaStreamDic.Remove(_streamName, out MediaStream mediaStream); } _normalShutdown = true; await ctx.CloseAsync(); } } catch { if (stream != null) { await stream.SendEofToAllSubscriberAndClose(); _mediaStreamDic.Remove(_streamName, out MediaStream mediaStream); } await ctx.CloseAsync(); } }