首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从源接收视频,预处理和流实时预览到客户端\ ASP.NET核心

从源接收视频,预处理和流实时预览到客户端\ ASP.NET核心
EN

Stack Overflow用户
提问于 2022-07-31 15:36:33
回答 1查看 268关注 0票数 1

我需要实现一个服务器,该服务器从某个来源获取视频,例如IPCamera,然后对图像进行预处理并将其流到客户端(如果请求的话)。

我已经用处理实现了这个部分,它接受单个帧(位图)并返回处理后的位图。我在挣扎的是从摄像机接收视频,然后把它传送到客户端。

怎样才是正确的方法呢?您推荐使用哪些库?服务器部件使用ASP.NET核心,客户端使用角/响应。

我试图实现gRPC,但是gRPC客户端的类型记录似乎很麻烦。

编辑: 02.08.2022

到目前为止,我所取得的成就:

我想出了如何接收摄像机输出的图像。

我发现了RTSP客户端的C#。资料来源:用于C# .NET的RTSP客户机,它运行得很好。我可以在小到无延迟的情况下接收输出,我用我的手机来模拟RTSP摄像头/服务器。

因此RTSP客户端接收原始帧(在我的例子中是H.264 IFrame/PFrame)。问题是,我需要解码这些帧,最好是位图,因为我使用YoloV4 ONXX模型进行对象检测。下面是我如何用YoloV4设置ML.Net的方法。来源:基于ML.NET的机器学习-基于YOLO的对象检测

为了解码原始帧,我使用了 FFMpeg (遗憾的是,我没有找到任何可以与.NET Core一起工作的FFMPEG包,我尝试了AForge.Net、协议,但在这两个包中,由于某种原因,FFMPEG命名空间在安装后都丢失了,所以我在Github中挖掘并使用了这个项目FrameDecoderCore)。这不是最好的解决办法,但有效。现在我可以接收输出并将其解码为位图。

现在我面临三个主要问题:

  1. 如何在不延迟接收摄像机输出的情况下检测物体。以及如何在没有训练的情况下正确地建立一个onnx模型来进行预测。
  2. 如何将处理过的位图转换回视频流。每当检测到所需对象时,我还需要能够将其部分保存为磁盘上的视频文件(视频格式并不重要)。
  3. 当客户端希望看到相机输出时,如何将已处理或未处理的输出流到客户端。-我在想这里的gRPC,发送位图,然后在HTML上显示。

下面是我的服务现状:

代码语言:javascript
复制
public class CCTVService : BackgroundService
    {
        private readonly RtspClient _rtspClient;
        private readonly ILogger<CCTVService> _logger;

        private const int streamWidth = 480;
        private const int streamHeight = 640;

        private static readonly FrameDecoder FrameDecoder = new FrameDecoder();
        private static readonly FrameTransformer FrameTransformer = new FrameTransformer(streamWidth, streamHeight);

        public CCTVService(ILogger<CCTVService> logger)
        {
            _logger = logger;
            _rtspClient = new RtspClient(new ConnectionParameters(new Uri("rtsp://192.168.0.99:5540/ch0")));
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
         {
            using (_rtspClient)
            {
                try
                {
                    await _rtspClient.ConnectAsync(stoppingToken);
                    _logger.LogInformation("Connecting to RTSP");
                }
                catch(RtspClientException clientException)
                {
                    _logger.LogError(clientException.Message);
                    //throw;
                }

                _rtspClient.FrameReceived += (obj, rawFrame) =>
                {
                    if (rawFrame is not RawVideoFrame rawVideoFrame)
                        return;

                    var decodedFrame = FrameDecoder.TryDecode(rawVideoFrame);

                    if (decodedFrame == null) 
                        return;

                    using var bitmap = FrameTransformer.TransformToBitmap(decodedFrame);

                    _logger.LogInformation($"Timestamp: {new DateTimeOffset(rawFrame.Timestamp).ToUnixTimeSeconds()} Timestamp-diff: {new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds() - new DateTimeOffset(rawFrame.Timestamp).ToUnixTimeSeconds()}");

                    // save bitmaps | Test
                    //var t = new Thread(() =>
                    //{
                    //    using var bitmap = FrameTransformer.TransformToBitmap(decodedFrame);
                    //    var name = "./test/" + new DateTimeOffset(rawFrame.Timestamp).ToUnixTimeMilliseconds().ToString() + " - " + new Random().NextInt64().ToString() + ".bmp";
                    //    bitmap.Save(name);
                    //});
                    //t.Priority = ThreadPriority.Highest;
                    //t.Start();
                };

                try
                {
                    await _rtspClient.ReceiveAsync(stoppingToken);
                }
                catch
                {
                    // swallow
                }
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2022-08-02 23:24:08

因此,我不能真正帮助您的问题的第2和第3部分,但对于ML.NET,您可能考虑的事情之一是批量预测。您可以收集10-20帧而不是一次对它们进行预处理,而不是使用PredictionEngine,而是使用Transform将其传递到IDataView中而不是Bitmap中。

下面是在应用程序中使用ONNX模型的一些示例。WPF示例可能感兴趣,因为它使用网络摄像头来捕获输入。我相信它使用的是本地Windows,与您在web上使用的方式非常不同,但无论如何,它可能是值得一看的。

https://github.com/dotnet/machinelearning-samples/tree/main/samples/csharp/end-to-end-apps/ObjectDetection-Onnx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73184619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档