首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用硬件在DeckLink上将YUV转换为RGB

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

Stack Overflow用户
提问于 2015-01-16 15:46:44
回答 2查看 3K关注 0票数 2

我目前正在摄取HD1080p视频59.94FPS从摄像机通过HDMI输入的DeckLink 4K极端。

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

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

所有这些都是应该做的,当我运行程序时,图像确实是在帧到达时实时更新的。

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

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

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

我尝试使用IDeckLinkVideoConversion::ConvertFrame()来转换每个帧。

Problem:ConvertFrame()需要使用IDeckLinkOutput::CreateVideoFrame()在DeckLink上呈现目标帧。正如我目前所理解的,DeckLink不能同时充当输入(捕捉视频提要)和输出(呈现目标帧)。

我已经将传入流设置为8 8BitYUV,并以BGR32格式将每个帧复制到BGR32中。

Problem:正如我前面提到的,这将显示一个图像,但是颜色不正确,并且图片只有它所需宽度的一半。

原因是8 8BitYUV的输入流是16位/像素,而位图期望32位/像素,所以位图将每个传入的MacroPixel (4个字节)当作一个像素,而不是实际的2像素。

目前,我使用像素着色器修复颜色,使用RenderTransform水平缩放图像的2倍,以“固定”高宽比。问题是我有一半原来的决议。

我不相信这是一个硬件限制,因为当我将另一个监视器连接到DeckLink上的HDMI输出时,传入的图片以完全1080 p的完美颜色显示。是否有可能捕获内存中某个地方的传出流?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-16 16:55:14

你有几个选择。

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

第二个选择是根据需要转换为RGB。我不认为DeckLink可以为您做到这一点,而且基于GPU的转换是绝对存在的(转换公式是众所周知的,简单且易于并行化),但是硬件依赖的,或者不是立即可用的。相反,微软发布了彩色转换器DSP,它可以非常有效地完成转换(从8位,而不是10位)。API是原生的,您可能需要媒体基金会.NET从您的应用程序中访问它。另一种高效的软件转换也可以使用FFmpeg的libswscale (通过各自的包装器管理应用程序)进行。

票数 3
EN

Stack Overflow用户

发布于 2019-11-27 16:21:03

我只是在decklink api中这样做,因为我拥有的卡既可以作为输入,也可以作为输出。而的输出不需要处于回放模式才能访问api的这一部分:

代码语言:javascript
复制
com_ptr<IDeckLinkOutput> m_deckLinkOutput;
if (SUCCEEDED(m_deckLink->QueryInterface(IID_IDeckLinkOutput, (void **)&m_deckLinkOutput)))
{
    IDeckLinkMutableVideoFrame *pRGBFrame;
    if (SUCCEEDED(m_deckLinkOutput->CreateVideoFrame(videoFrame->GetWidth(), videoFrame->GetHeight(), videoFrame->GetWidth() * 4, bmdFormat8BitBGRA, videoFrame->GetFlags(), &pRGBFrame)))
    {
        m_deckLinkVideoConversion->ConvertFrame(pFrame, pRGBFrame);

        //use the rgbFrame

        pRGBFrame->Release();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27987666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档