我需要实现一个服务器,该服务器从某个来源获取视频,例如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)。这不是最好的解决办法,但有效。现在我可以接收输出并将其解码为位图。
现在我面临三个主要问题:
下面是我的服务现状:
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
}
}
}
}发布于 2022-08-02 23:24:08
因此,我不能真正帮助您的问题的第2和第3部分,但对于ML.NET,您可能考虑的事情之一是批量预测。您可以收集10-20帧而不是一次对它们进行预处理,而不是使用PredictionEngine,而是使用Transform将其传递到IDataView中而不是Bitmap中。
下面是在应用程序中使用ONNX模型的一些示例。WPF示例可能感兴趣,因为它使用网络摄像头来捕获输入。我相信它使用的是本地Windows,与您在web上使用的方式非常不同,但无论如何,它可能是值得一看的。
https://stackoverflow.com/questions/73184619
复制相似问题