private void ProcessM3u8(HttpListenerContext context, JT1078AVInfo jT1078AVInfo) { if (authorization.Authorization(context, out IPrincipal principal)) { hLSRequestManager.HandleHlsRequest(context, principal, jT1078AVInfo); } }
private async ValueTask ProcessRequestAsync(HttpListenerContext context, IPrincipal principal) { if (context.Request.RawUrl.StartsWith("/favicon.ico")) { context.Http404(); return; } if (context.Request.RawUrl.Contains(".m3u8") || context.Request.RawUrl.Contains(".ts")) { hLSRequestManager.HandleHlsRequest(context, principal); return; } if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"[http RequestTraceIdentifier]:{context.Request.RequestTraceIdentifier.ToString()}-{context.Request.RemoteEndPoint.ToString()}"); } if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"[http RequestTraceIdentifier]:{context.Request.RequestTraceIdentifier.ToString()}-{context.Request.RemoteEndPoint.ToString()}"); } string sim = context.Request.QueryString.Get("sim"); string channel = context.Request.QueryString.Get("channel"); if (string.IsNullOrEmpty(sim) || string.IsNullOrEmpty(channel)) { await context.Http400(); return; } int.TryParse(channel, out int channelNo); if (context.Request.IsWebSocketRequest) { HttpListenerWebSocketContext wsContext = await context.AcceptWebSocketAsync(null, keepAliveInterval : TimeSpan.FromSeconds(5)); var jT1078HttpContext = new JT1078HttpContext(context, wsContext, principal); jT1078HttpContext.Sim = sim; jT1078HttpContext.ChannelNo = channelNo; jT1078HttpContext.RTPVideoType = RTPVideoType.Ws_Flv; SessionManager.TryAdd(jT1078HttpContext); //这个发送出去,flv.js就报错了 //await jT1078HttpContext.WebSocketSendHelloAsync(); await Task.Factory.StartNew(async(state) => { //https://www.bejson.com/httputil/websocket/ //ws://localhost:15555?token=22&sim=1221&channel=1 var websocketContext = state as JT1078HttpContext; while (websocketContext.WebSocketContext.WebSocket.State == WebSocketState.Open || websocketContext.WebSocketContext.WebSocket.State == WebSocketState.Connecting) { var buffer = ArrayPool <byte> .Shared.Rent(256); try { //客户端主动断开需要有个线程去接收通知,不然会客户端会卡死直到超时 WebSocketReceiveResult receiveResult = await websocketContext.WebSocketContext.WebSocket.ReceiveAsync(buffer, CancellationToken.None); if (receiveResult.EndOfMessage) { if (receiveResult.Count > 0) { var data = buffer.AsSpan().Slice(0, receiveResult.Count).ToArray(); if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"[ws receive]:{Encoding.UTF8.GetString(data)}"); } await websocketContext.WebSocketSendTextAsync(data); } } } finally { ArrayPool <byte> .Shared.Return(buffer); } } if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation($"[ws close]:{websocketContext.SessionId}-{websocketContext.Sim}-{websocketContext.ChannelNo}-{websocketContext.StartTime:yyyyMMddhhmmss}"); } SessionManager.TryRemove(websocketContext.SessionId); }, jT1078HttpContext); } else { var jT1078HttpContext = new JT1078HttpContext(context, principal); jT1078HttpContext.Sim = sim; jT1078HttpContext.RTPVideoType = RTPVideoType.Http_Flv; jT1078HttpContext.ChannelNo = channelNo; SessionManager.TryAdd(jT1078HttpContext); } }