.NET Преобразование растровых кадров из веб-камеры в байтовый массив с использованием ArrayPool - PullRequest
0 голосов
/ 29 октября 2018

Я пишу приложение 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. Прямо сейчас я хотел бы оптимизировать это преобразование из растрового изображения в байтовый массив, а не смотреть на архитектуру приложения. Тем не менее, если у вас есть предложение, как это сделать совершенно по-другому, я также буду признателен (кто знает, как приложение будет выглядеть в будущем)

...