Каков быстрый способ создания и рисования видео в WPF?

Я пишу видеопроигрыватель для воспроизведения кадров, захваченных нашим ASIC. Они имеют специальный формат, и мне предоставили функцию, которая декодирует состояния ASIC. Видео может быть любого размера от 640х480 до 2560х1200 (!!!). Результатом каждого цикла состояний являются блоки пикселей размером 16x16, которые я должен вставить в видео на экране.

Каждый раз, когда экран требует обновления, у меня есть следующая информация:

  • Ширина блока
  • Высота блока
  • Координата X начала блока
  • Координата Y начала блока
  • 1-мерный массив информации о цвете пикселей RGB32

Основные ограничения:

  • .NET 3.5
  • Нет небезопасного кода

Сегодня утром я пробовал WriteableBitmap и использовал его в качестве источника изображения, примерно так:

    private WriteableBitmap ImageSource;

    public MainWindow()
    {
        InitializeComponent();

        ImageSource = new WriteableBitmap(FrameWidth, FrameHeight, 96, 96, PixelFormats.Bgr32, null);
        ImagePanel.Source = ImageSource;
    }

    private void DrawBox(byte Red, byte Green, byte Blue, int X, int Y)
    {
        int BoxWidth = 16;
        int BoxHeight = 16;
        int BytesPerPixel = ImageSource.Format.BitsPerPixel / 8;

        byte[] Pixels = new byte[BoxWidth * BoxHeight * BytesPerPixel];

        for (int i = 0; i < Pixels.Length; i += 4)
        {
            Pixels[i + 0] = Blue;
            Pixels[i + 1] = Green;
            Pixels[i + 2] = Red;
            Pixels[i + 3] = 0;
        }

        int Stride = BoxWidth * BytesPerPixel;
        Int32Rect DrawBox = new Int32Rect(X, Y, BoxWidth, BoxHeight);

        ImageSource.Lock();
        ImageSource.WritePixels(DrawBox, Pixels, Stride, 0);
        ImageSource.Unlock();
    }

Это работает, мое видео воспроизводится на экране, но медленнооооооооо . И даже близко к скорости воспроизведения в реальном времени. Есть ли лучший способ, помимо процедурного создания серии растровых изображений, сделать это, чего я не вижу? Я кое-что читал о D3Dimage, но, похоже, это больше для экспорта 3D-сцены в растровое изображение. Есть предложения?

5
задан Stevoman 23 November 2010 в 18:45
поделиться