我目前正在通过 DeckLink 4K Extreme 上的 HDMI 输入从摄像机以 59.94 FPS 的速度摄取 HD1080p 视频。
我的目标是在 WPF UI 元素中复制传入的图像。为此,我在 C# WPF 应用程序中使用了 DeckLink SDK。
在这个程序中,我实现了 VideoInputFrameArrived 回调。在这个回调中,我将每个帧中的字节复制到一个 WriteableBitmap 中,我已将其设置为图像的源。
所有这些都可以正常工作,当我运行程序时,图像确实会在帧到达时实时更新。
那么我的问题是,视频输入中仅有的两种受支持的像素格式是 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。