Как рендерить видео из кадров ARGB

Я использую библиотеку Microsoft.MixedReality.WebRTC и планирую использовать ее в своем следующем проекте - приложении для видеочата в реальном времени. Мне удалось установить соединение и передавать кадры видео.

Как правильно визуализировать эти кадры и отображать их как видео?

Использование WPF MediaElement кажется довольно простым, но я могу ввести только объект Uri в качестве источника, я не могу кормить его отдельными кадрами, AFAIK.

Я читал, что рисование растровых изображений - возможное решение, но я уверен, что это означало бы много часов на изобретение колеса и тестирование, что я не фанат, если нет другого пути.

Библиотека работает следующим образом: Каждый раз, когда клиент получает новый фрейм, возникает событие Argb32VideoFrameReady. Затем в функцию обратного вызова передается объект структуры Argb32VideoFrame, который содержит IntPtr необработанных данных. Height, Width и Stride также предоставляются.

Подробнее о конкретной структуре здесь

Какими способами я мог бы этого добиться?

Я планирую использовать WPF. Решение должно быть нацелено на Windows 7+ и .Net Framework 4.6.2.

Заранее благодарим.


person AsPas    schedule 30.07.2020    source источник
comment
Поскольку у вас уже есть необработанные данные пикселей, вы можете просто записать их в WriteableBitmap. См. документы .microsoft.com / en-us / dotnet / api / Или скопируйте его в его BackBuffer в фоновом потоке: docs.microsoft.com/en-us/dotnet/api/   -  person Clemens    schedule 30.07.2020


Ответы (1)


С элементом изображения в XAML

<Image x:Name="image"/>

простой метод ниже будет напрямую копировать фрейм в WriteableBitmap, который назначается свойству Source Image.

private void UpdateImage(Argb32VideoFrame frame)
{
    var bitmap = image.Source as WriteableBitmap;
    var width = (int)frame.width;
    var height = (int)frame.height;

    if (bitmap == null ||
        bitmap.PixelWidth != width ||
        bitmap.PixelHeight != height)
    {
        bitmap = new WriteableBitmap(
            width, height, 96, 96, PixelFormats.Bgra32, null);
        image.Source = bitmap;
    }

    bitmap.WritePixels(
        new Int32Rect(0, 0, width, height),
        frame.data, height * frame.stride, frame.stride);
}

ARGBVideoFrame отсюда: https://github.com/microsoft/MixedReality-WebRTC/blob/master/libs/Microsoft.MixedReality.WebRTC/VideoFrame.cs

PixelFormats.Bgra32 кажется правильным форматом из-за этого комментария к структуре:

Компоненты ARGB имеют порядок 32-битных целых чисел с прямым порядком байтов, поэтому 0xAARRGGBB или (B, G, R, A) как последовательность байтов в памяти, где B первым и A последним.

person Clemens    schedule 30.07.2020