使用硬件将YUV转换为DeckLink上的RGB

问题描述 投票:2回答:2

我目前正在通过DeckLink 4K Extreme上的HDMI输入从便携式摄像机摄取59.94 FPS的HD1080p视频。

我的目标是在WPF UI元素中复制传入的图像。为此,我在C#WPF应用程序中使用DeckLink SDK。

在此程序中,我实现了VideoInputFrameArrived回调。在此回调中,我将每个帧中的字节复制到WriteableBitmap中,并将其设置为Image的源。

所有这些都可以正常工作,当我运行程序时,图像确实会随着帧到达而实时更新。

那么,我的问题是,视频输入仅支持两种像素格式是8BitYUV和10BitYUV,这两种格式都不能在计算机显示器上本地显示。

WriteableBitmap只能采用各种RGB,黑白和CMYK格式。

这是到目前为止我尝试过的。


我已经尝试使用IDeckLinkVideoConversion :: ConvertFrame()转换每一帧

问题:ConvertFrame()要求使用IDeckLinkOutput :: CreateVideoFrame()在DeckLink上渲染目标帧。据我目前所知,DeckLink不能同时用作输入(捕获视频馈送)和输出(渲染目标帧)。


我将传入流设置为8BitYUV,并将每个帧复制为BGR32格式的WriteableBitmap。

问题:如前所述,这将显示图像,但是颜色不正确,并且图像仅是所需宽度的一半。

原因是8BitYUV的传入流为16位/像素,而位图期望为32位/像素,因此位图将每个传入的MacroPixel(4字节)都视为一个像素,而不是它实际的2个像素。是。


[目前,我正在使用像素着色器固定颜色,并使用RenderTransform将图像水平缩放2倍,以“固定”长宽比。问题是我只有原始分辨率的一半。

我不认为这是硬件限制,因为当我将另一台显示器连接到DeckLink上的HDMI输出时,传入的图片将以完整的1080p显示为完美的色彩。是否可以在内存中的某个位置捕获传出的流?

TL; DR实时将4:2:2 YUV(UYVY)转换为RGB或CMYK像素格式的最佳方法是什么? (1080p @ 59.94 FPS)

最好是硬件解决方案,即DeckLink或GPU。

wpf video-capture hardware-acceleration writeablebitmap pixelformat
2个回答
3
投票

您在这里有几种选择。

首先,您可以直接显示UYVY。大多数视频适配器都可以通过DirectDraw,DirectShow,DirectX版本(最多9个API)接受UYVY数据,并且不需要实时转换视频帧。将其集成到WPF应用程序中可能需要一些工作,也许最流行的方法是通过DirectShow.NET库和WPF Media Kit利用DirectShow。但是,通过这种方式,您还可以使用DeckLink的视频捕获DirectShow过滤器来捕获视频。您可以将所有部件更快地连接在一起,但是您已经使用DeckLink SDK进行捕获,因此您可以在捕获过程中拥有更多的控制权和灵活性,因此您可能不想回到DirectShow。

第二个选项是根据需要转换为RGB。我认为DeckLink不能为您做到这一点,并且确实存在基于GPU的转换(转换公式是众所周知的,简单且易于并行化的),但是它依赖于硬件或无法立即使用。相反,Microsoft提供了Color Converter DSP,它可以以非常有效的方式进行转换(从8位而不是10位)。该API是本机API,您可能需要Media Foundation .NET才能从您的应用访问它。也可以使用FFmpeg的libswscale(对于通过相应包装器管理的应用程序)完成另一种有效的软件转换。


0
投票

我刚刚使用decklink api完成了此操作,因为我拥有的卡既可以用作输入也可以用作输出。输出do not

© www.soinside.com 2019 - 2024. All rights reserved.