using DotNetty.Buffers; using DotNetty.Codecs.Http.WebSockets; using JT1078.DotNetty.Core.Session; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using JT1078.Protocol; using System.Collections.Concurrent; using JT1078.Protocol.Enums; using System.Diagnostics; using System.IO.Pipes; using Newtonsoft.Json; namespace JT1078.DotNetty.TestHosting { /// /// /// class FFMPEGWSFLVPHostedService :BackgroundService { private readonly Process process; private readonly NamedPipeServerStream pipeServerOut; private const string PipeNameOut = "demo2serverout"; private readonly JT1078WebSocketSessionManager jT1078WebSocketSessionManager; /// /// 需要缓存flv的第一包数据,当新用户进来先推送第一包的数据 /// private byte[] flvFirstPackage; private ConcurrentDictionary exists = new ConcurrentDictionary(); public FFMPEGWSFLVPHostedService( JT1078WebSocketSessionManager jT1078WebSocketSessionManager) { pipeServerOut = new NamedPipeServerStream(PipeNameOut, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous,102400,102400); process = new Process { StartInfo = { FileName = @"C:\ffmpeg\bin\ffmpeg.exe", Arguments = $@"-f dshow -i video={HardwareCamera.CameraName} -c copy -f flv -vcodec h264 -y \\.\pipe\{PipeNameOut}", UseShellExecute = false, CreateNoWindow = true, } }; this.jT1078WebSocketSessionManager = jT1078WebSocketSessionManager; } public override void Dispose() { try { process.Close(); pipeServerOut.Flush(); } catch { } process.Dispose(); pipeServerOut.Dispose(); base.Dispose(); } protected override Task ExecuteAsync(CancellationToken stoppingToken) { process.Start(); Task.Run(() => { while (true) { try { Console.WriteLine("IsConnected>>>" + pipeServerOut.IsConnected); if (pipeServerOut.IsConnected) { if (pipeServerOut.CanRead) { Span v1 = new byte[2048]; var length = pipeServerOut.Read(v1); var realValue = v1.Slice(0, length).ToArray(); if (realValue.Length <= 0) continue; if (flvFirstPackage == null) { flvFirstPackage = realValue; } if (jT1078WebSocketSessionManager.GetAll().Count() > 0) { foreach (var session in jT1078WebSocketSessionManager.GetAll()) { if (!exists.ContainsKey(session.Channel.Id.AsShortText())) { session.Channel.WriteAndFlushAsync(new BinaryWebSocketFrame(Unpooled.WrappedBuffer(flvFirstPackage))); exists.TryAdd(session.Channel.Id.AsShortText(), 0); } session.Channel.WriteAndFlushAsync(new BinaryWebSocketFrame(Unpooled.WrappedBuffer(realValue))); } } } } else { if (!pipeServerOut.IsConnected) { Console.WriteLine("WaitForConnection Star..."); pipeServerOut.WaitForConnectionAsync(); Console.WriteLine("WaitForConnection End..."); } } } catch (Exception ex) { Console.WriteLine(ex); } } }); return Task.CompletedTask; } } }