我目前正通过DeckLink 4K Extreme上的HDMI输入从摄像机以59.94 FPS摄取HD1080p视频 .
我的目标是在WPF UI元素中复制传入的图像 . 为了实现这一点,我在C#WPF应用程序中使用DeckLink SDK .
在这个程序中,我实现了VideoInputFrameArrived回调 . 在这个回调中,我将每帧中的字节复制到WriteableBitmap中,我将其设置为Image的源 .
所有这些都可以正常工作,当我运行程序时,Image确实会在帧到达时实时更新 .
我的问题是,视频输入中唯一支持的两种Pixel格式是8BitYUV和10BitYUV,它们都不能在计算机显示器上本地显示 .
WriteableBitmap只能采用各种RGB,黑白和CMYK格式 .
这是我到目前为止所尝试的内容 .
我试图使用IDeckLinkVideoConversion :: ConvertFrame()转换每个帧
Problem :ConvertFrame()需要使用IDeckLinkOutput :: CreateVideoFrame()在DeckLink上呈现目标帧 . 正如我目前所理解的那样,DeckLink不能同时充当输入(捕获视频输入)和输出(渲染目标帧) .
我已将传入流设置为8BitYUV,并将每个帧复制到WriteableBitmap中,格式为BGR32 .
Problem :正如我前面提到的,这将显示一个图像,但颜色不正确,图片只是它需要的宽度的一半 .
原因是8BitYUV的输入流是16位/像素,而Bitmap需要32位/像素,因此Bitmap将每个输入的MacroPixel(4个字节)视为一个像素,而不是它实际上是2个像素 .
目前我使用像素着色器来修复颜色,使用RenderTransform将图像水平缩放2倍以“修复”宽高比 . 问题是,我有一半的原始分辨率 .
我不认为这是硬件限制,因为当我将另一台显示器连接到DeckLink上的HDMI输出时,输入的图像以完整的1080p显示完美的颜色 . 是否有可能在内存中的某个地方捕获该传出流?
TL;DR 将4:2:2 YUV(UYVY)实时转换为RGB或CMYK像素格式的最佳方法是什么? (1080p @ 59.94 FPS)
优选地,硬件解决方案,即DeckLink或GPU .