From d394f3a80f4ee23d3648ef8cf01ff9b6e6ec39aa Mon Sep 17 00:00:00 2001 From: danielgrabowski Date: Mon, 4 Nov 2019 14:28:45 +0100 Subject: [PATCH] Streaming work --- Squirrowse.Client/Program.cs | 5 +++- Squirrowse.Client/Service/Camera.cs | 29 +++++++++++++++++++++ Squirrowse.Client/Service/CameraFactory.cs | 12 +++++++++ Squirrowse.Client/Service/CameraService.cs | 29 ++++++++++++++------- Squirrowse.Client/Service/ICameraFactory.cs | 10 +++++++ Squirrowse.Client/Service/ICameraService.cs | 8 +++--- Squirrowse.Client/Service/StreamService.cs | 13 ++++----- Squirrowse.Client/Worker.cs | 24 ++++++++++------- Squirrowse.Service/Startup.cs | 3 +++ 9 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 Squirrowse.Client/Service/Camera.cs create mode 100644 Squirrowse.Client/Service/CameraFactory.cs create mode 100644 Squirrowse.Client/Service/ICameraFactory.cs diff --git a/Squirrowse.Client/Program.cs b/Squirrowse.Client/Program.cs index df4e7ae..0cad8cd 100644 --- a/Squirrowse.Client/Program.cs +++ b/Squirrowse.Client/Program.cs @@ -17,7 +17,10 @@ namespace Squirrowse.Client .ConfigureServices((hostContext, services) => { services.AddHostedService(); - services.AddTransient(); //keep as transient for now + services.AddSingleton(x=> new ConnectionManager("http://localhost", 5000)); //keep as transient for now + services.AddSingleton< ICameraService, CameraService >(x=>new CameraService(new Camera())); + services.AddTransient(); + }); } } diff --git a/Squirrowse.Client/Service/Camera.cs b/Squirrowse.Client/Service/Camera.cs new file mode 100644 index 0000000..1a83f47 --- /dev/null +++ b/Squirrowse.Client/Service/Camera.cs @@ -0,0 +1,29 @@ +using OpenCvSharp; + +namespace Squirrowse.Client.Service +{ + public class Camera : CameraFactory + { + private readonly bool Disposable; + private readonly double Fps; + private readonly int Height; + private readonly int Width; + + public Camera(int height = 480, int width = 640, double fps = 15f) + { + Height = height; + Width = width; + Fps = fps; + } + + public override VideoCapture GetCamera() + { + var cam = new VideoCapture(CaptureDevice.Any) + { + Fps = Fps, FrameHeight = Height, FrameWidth = Width + }; + + return cam; + } + } +} \ No newline at end of file diff --git a/Squirrowse.Client/Service/CameraFactory.cs b/Squirrowse.Client/Service/CameraFactory.cs new file mode 100644 index 0000000..5a876d7 --- /dev/null +++ b/Squirrowse.Client/Service/CameraFactory.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenCvSharp; + +namespace Squirrowse.Client.Service +{ + public abstract class CameraFactory + { + public abstract VideoCapture GetCamera(); + } +} diff --git a/Squirrowse.Client/Service/CameraService.cs b/Squirrowse.Client/Service/CameraService.cs index 0df48b5..685355d 100644 --- a/Squirrowse.Client/Service/CameraService.cs +++ b/Squirrowse.Client/Service/CameraService.cs @@ -1,25 +1,34 @@ using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; using System.Threading.Tasks; using OpenCvSharp; +using Squirrowse.Core.Services; namespace Squirrowse.Client.Service { public class CameraService : ICameraService { - public VideoCapture GetCamera(int height = 480, int widght = 640, double fps = 15f, bool disposable = false) + private readonly VideoCapture _videoCapture; + public CameraService(CameraFactory cam) { - var cam = new VideoCapture(CaptureDevice.Any); - cam.Fps = fps; - cam.FrameHeight = height; - cam.FrameWidth = widght; - cam.IsEnabledDispose = disposable; - - return cam; + _videoCapture = cam.GetCamera(); } - public Task GetFrame(VideoCapture video) + + public async Task GetFrame() + { + var video = _videoCapture.RetrieveMat(); + return video; + } + + public async IAsyncEnumerable GetFramesAsyncEnumerator() { - throw new NotImplementedException(); + while (true) + { + var fr = await GetFrame(); + yield return fr.ConvertToJpgByte(); + } } } } \ No newline at end of file diff --git a/Squirrowse.Client/Service/ICameraFactory.cs b/Squirrowse.Client/Service/ICameraFactory.cs new file mode 100644 index 0000000..c687cc9 --- /dev/null +++ b/Squirrowse.Client/Service/ICameraFactory.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Squirrowse.Client.Service +{ + public interface ICameraFactory + { + } +} diff --git a/Squirrowse.Client/Service/ICameraService.cs b/Squirrowse.Client/Service/ICameraService.cs index 3c9d75d..784b1f0 100644 --- a/Squirrowse.Client/Service/ICameraService.cs +++ b/Squirrowse.Client/Service/ICameraService.cs @@ -1,11 +1,13 @@ -using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; using OpenCvSharp; namespace Squirrowse.Client.Service { public interface ICameraService { - VideoCapture GetCamera(int height = 480, int widght = 640, double fps = 15f, bool disposable = false); - Task GetFrame(VideoCapture video); + Task GetFrame(); + IAsyncEnumerable GetFramesAsyncEnumerator(); } } \ No newline at end of file diff --git a/Squirrowse.Client/Service/StreamService.cs b/Squirrowse.Client/Service/StreamService.cs index b25ae02..a8652b3 100644 --- a/Squirrowse.Client/Service/StreamService.cs +++ b/Squirrowse.Client/Service/StreamService.cs @@ -17,7 +17,7 @@ namespace Squirrowse.Client.Service this.connectionManager = connectionManager; this.logger = logger; session = connectionManager.Connect(); - session.StartAsync().ConfigureAwait(false); + session.StartAsync(); } public async Task SayHello() @@ -27,14 +27,11 @@ namespace Squirrowse.Client.Service public async Task SendStreamAsync(IAsyncEnumerable asb) { - try + while (true) { - logger.LogInformation($"{nameof(SendStreamAsync)} Start stream"); - await session.SendAsync("UploadByteStream", asb); - } - finally - { - logger.LogInformation($"{nameof(SendStreamAsync)} End stream"); + + logger.LogInformation($"{nameof(SendStreamAsync)} Start stream"); + await session.SendAsync("UploadByteStream", asb); } } } diff --git a/Squirrowse.Client/Worker.cs b/Squirrowse.Client/Worker.cs index 74d05be..bf7ab9e 100644 --- a/Squirrowse.Client/Worker.cs +++ b/Squirrowse.Client/Worker.cs @@ -9,23 +9,27 @@ namespace Squirrowse.Client { public class Worker : BackgroundService { - private readonly ILogger _logger; - private readonly IStreamService _streamService; + private readonly ILogger logger; + private readonly IStreamService streamService; + private readonly ICameraService camera; - public Worker(ILogger logger, IStreamService streamService) + public Worker(ILogger logger, IStreamService streamService, ICameraService camera) { - _logger = logger; - _streamService = streamService; + this.logger = logger; + this.streamService = streamService; + this.camera = camera; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - while (!stoppingToken.IsCancellationRequested) - { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + + logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - await Task.Delay(1000, stoppingToken); - } + + await streamService.SendStreamAsync(camera.GetFramesAsyncEnumerator()); + + // await Task.Delay(1000, stoppingToken); + } } } \ No newline at end of file diff --git a/Squirrowse.Service/Startup.cs b/Squirrowse.Service/Startup.cs index aae1577..8ec5463 100644 --- a/Squirrowse.Service/Startup.cs +++ b/Squirrowse.Service/Startup.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Squirrowse.Core; using Squirrowse.Service.Hubs; namespace Squirrowse.Service @@ -23,6 +24,8 @@ namespace Squirrowse.Service { services.AddControllers(); services.AddMediatR(Assembly.GetAssembly(typeof(Startup))); + services.AddTransient(); + services.AddCoreModule(); services.AddSignalR() .AddHubOptions(opt => opt.MaximumReceiveMessageSize = 102400000) //~100mb per frame instead of 32kb default