Я пишу приложение ASP .NET, где вы можете смотреть видео с веб-камеры. Я использую пространство имен AForge.Video.DirectShow для подключения к веб-камере. Он возвращает мне кадры в виде растровых изображений, но мне нужно, чтобы они передавались в виде байтовых массивов. Я попытался сделать это с ArrayPool, а также использовать RecyclableMemoryStreamManager для переработки потоков памяти. Вот класс (упрощенный, чтобы включить только соответствующие части), который я написал для этого.
public class WebCamWrapper
{
private readonly VideoCaptureDevice videoSource;
private const int DefaultArraySize = 5000000;
private readonly ArrayPool<byte> byteArrayPool;
private readonly RecyclableMemoryStreamManager memoryStreamManager;
public byte[] FrameBytes { get; set; }
public WebCamWrapper()
{
byteArrayPool = ArrayPool<byte>.Create();
memoryStreamManager = new RecyclableMemoryStreamManager();
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += OnNewFrameReceived;
}
private void OnNewFrameReceived(object sender, NewFrameEventArgs frameEventArgs)
{
byte[] buffer = byteArrayPool.Rent(DefaultArraySize);
try
{
ConvertToArray((Bitmap)frameEventArgs.Frame.Clone(), buffer);
}
finally
{
byteArrayPool.Return(buffer);
}
}
private void ConvertToArray(Bitmap frame, byte[] buffer)
{
using (MemoryStream stream = memoryStreamManager.GetStream("ConvertToArray", buffer, 0, buffer.Length))
{
frame.Save(stream, ImageFormat.Png);
FrameBytes = stream.GetBuffer();
}
}
}
Затем я буду вызывать свойство FrameBytes из другого класса в цикле (опрос в основном). Это работает, мне просто интересно, есть ли лучший способ (по производительности), а также я не уверен, что я правильно использую ArrayPool здесь.
P.S. Прямо сейчас я хотел бы оптимизировать это преобразование из растрового изображения в байтовый массив, а не смотреть на архитектуру приложения. Тем не менее, если у вас есть предложение, как это сделать совершенно по-другому, я также буду признателен (кто знает, как приложение будет выглядеть в будущем)