diff --git a/Squirrowse.Client/Service/ActionDispatcher.cs b/Squirrowse.Client/Service/ActionDispatcher.cs index 2bd3df9..6b4ca5a 100644 --- a/Squirrowse.Client/Service/ActionDispatcher.cs +++ b/Squirrowse.Client/Service/ActionDispatcher.cs @@ -40,6 +40,7 @@ namespace Squirrowse.Client.Service public async Task SendStreamAsync(IAsyncEnumerable asb) { + if(!streamOn)return; logger.LogInformation($"{nameof(SendStreamAsync)} Start stream"); await session.SendAsync("UploadByteStream", asb); @@ -50,6 +51,7 @@ namespace Squirrowse.Client.Service public async Task StartStream() { + if (streamOn) return; streamOn = true; await SendStreamAsync(camera.GetFramesAsyncEnumerator()); } diff --git a/Squirrowse.Service/Hubs/IStreamManager.cs b/Squirrowse.Service/Hubs/IStreamManager.cs index cce229f..c27054e 100644 --- a/Squirrowse.Service/Hubs/IStreamManager.cs +++ b/Squirrowse.Service/Hubs/IStreamManager.cs @@ -11,8 +11,9 @@ namespace Squirrowse.Service.Hubs Task RemoveUserByUserName(string agentName); IEnumerable getServerSideUsers(); bool CheckUser(string agentName); - bool StreamOn(); IEnumerable getClientSideUsers(); IEnumerable getAllUsers(); + + Task SaveData(IAsyncEnumerable stream); } } \ No newline at end of file diff --git a/Squirrowse.Service/Hubs/StreamHub.cs b/Squirrowse.Service/Hubs/StreamHub.cs index 4145d18..a140a64 100644 --- a/Squirrowse.Service/Hubs/StreamHub.cs +++ b/Squirrowse.Service/Hubs/StreamHub.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; +using OpenCvSharp; using Squirrowse.Core.Models; +using Squirrowse.Core.Services; namespace Squirrowse.Service.Hubs { @@ -63,7 +66,7 @@ namespace Squirrowse.Service.Hubs public async Task Startstream(string clientId) { - manager.StreamOn() = true; + streamOn = true; //var client = Clients.Client(clientId); await Clients.Groups(Core.Models.Groups.normal.ToString()).SendAsync("Start"); // await client.SendAsync("Start"); @@ -78,16 +81,25 @@ namespace Squirrowse.Service.Hubs //await client.SendAsync("Stop"); } + public static bool streamOn { get; set; } + public async Task UploadByteStream(IAsyncEnumerable stream) { + manager.SaveData(stream); await foreach (var frame in stream) { - logger.LogInformation($"Got frame size: {frame.Length} "); - if (!streamOn) continue; - logger.LogInformation($"Send frame of size: {frame.Length} to {Core.Models.Groups.superUser.ToString()}"); - await Clients.Groups(Core.Models.Groups.superUser.ToString()).SendAsync("RecData", frame); - + var frameStamp = frame.ConvertByteToMat(); + string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", + CultureInfo.InvariantCulture); + Cv2.PutText(frameStamp, timestamp, new Point(1,480/2), HersheyFonts.HersheySimplex,0.5f,Scalar.Red); + logger.LogInformation($"{this.GetHashCode()}: send frame"); + //logger.LogInformation($"Got frame size: {frame.Length} "); + //if (!streamOn) continue; + // logger.LogInformation($"Send frame of size: {frame.Length} to {Core.Models.Groups.superUser.ToString()}"); + await Clients.Groups(Core.Models.Groups.superUser.ToString()).SendAsync("RecData", frameStamp.ConvertToJpgByte()); + logger.LogInformation($"{this.GetHashCode()}: send data"); //await Task.Delay(100); //leave some delay for debug purpose + await Task.Delay(1000/30); } } diff --git a/Squirrowse.Service/Hubs/StreamManager.cs b/Squirrowse.Service/Hubs/StreamManager.cs index 4063987..2940f98 100644 --- a/Squirrowse.Service/Hubs/StreamManager.cs +++ b/Squirrowse.Service/Hubs/StreamManager.cs @@ -1,18 +1,17 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using OpenCvSharp; using Squirrowse.Core.Models; +using Squirrowse.Core.Services; namespace Squirrowse.Service.Hubs { public class StreamManager : IStreamManager { private readonly List _users = new List(); //temporary - private bool stream; - public bool streamOn() - { - return stream; - } + public bool StreamOn { get; set; } public Task AddUser(string connectionId, string userName, ConnectionType type) { _users.Add(new User(connectionId, userName, type)); @@ -36,6 +35,7 @@ namespace Squirrowse.Service.Hubs return _users.Where(user => user.UserType == ConnectionType.Server); } + public IEnumerable getClientSideUsers() { return _users.Where(user => user.UserType == ConnectionType.Client); @@ -51,5 +51,15 @@ namespace Squirrowse.Service.Hubs var t = _users; return _users; } + + public async Task SaveData(IAsyncEnumerable stream) + { + VideoWriter output = new VideoWriter("m.avi",FourCC.DIVX,30,new Size(640,480)); + + await foreach (var b in stream) + { + output.Write(b.ConvertByteToMat()); + } + } } } \ No newline at end of file diff --git a/Squirrowse.Service/Squirrowse.Service.csproj b/Squirrowse.Service/Squirrowse.Service.csproj index 6a103d7..7263b02 100644 --- a/Squirrowse.Service/Squirrowse.Service.csproj +++ b/Squirrowse.Service/Squirrowse.Service.csproj @@ -4,6 +4,16 @@ netcoreapp3.0 + + + + + + + PreserveNewest + + + diff --git a/Squirrowse.Service/dll/openh264-1.8.0-win64.dll b/Squirrowse.Service/dll/openh264-1.8.0-win64.dll new file mode 100644 index 0000000..99fb7b2 Binary files /dev/null and b/Squirrowse.Service/dll/openh264-1.8.0-win64.dll differ diff --git a/Squirrowse.Service/dupa.avi b/Squirrowse.Service/dupa.avi new file mode 100644 index 0000000..77f70ef Binary files /dev/null and b/Squirrowse.Service/dupa.avi differ diff --git a/Squirrowse.Service/dupa.mkv b/Squirrowse.Service/dupa.mkv new file mode 100644 index 0000000..3a6ce66 Binary files /dev/null and b/Squirrowse.Service/dupa.mkv differ