Decklink SDK & QtQuick

Decklink SDK & QtQuick

本文关键字:QtQuick SDK Decklink      更新时间:2023-10-16

我正在尝试使用BlackMagic Decklink SDK将视频从Decklink卡显示到QtQuick应用程序中。我成功地使用QWidgets做了同样的事情,所以视频流采集部分正在工作。

当使用QWidgets(更具体地说是QOpenGLWidget(时,基本上我们所要做的就是创建QOpenGLWidget的子类并覆盖initializeGL和paintGL,如下所示:

void DeckLinkOpenGLWidget::initializeGL()
{
    if (m_deckLinkScreenPreviewHelper != nullptr)
    {
        m_mutex.lock();
        m_deckLinkScreenPreviewHelper->InitializeGL();
        m_mutex.unlock();
    }
}
void DeckLinkOpenGLWidget::paintGL()
{
    m_mutex.lock();
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    m_deckLinkScreenPreviewHelper->PaintGL();
    m_mutex.unlock();
}

当使用QtQuick在自定义渲染器中执行相同的操作时,没有任何反应。我想我必须编写我的程序和着色器,但我不知道它需要什么。当使用着色器对颜色中的每个像素进行着色时,会绘制该颜色的正方形,所以我想我离得不远(但可能是错的......

下面是一些代码:

void VideoViewRenderer::initializeGL()
{
    QOpenGLFunctions::initializeOpenGLFunctions();
    const char* vertexShaderSource = "#version 330 coren"
                                     "layout (location = 0) in vec3 aPos;n"
                                     "void main()n"
                                     "{n"
                                     "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);n"
                                     "}n";
    const char* fragmentShaderSource = "#version 330 coren"
                                       "out vec4 FragColor;n"
                                       "void main()n"
                                       "{n"
                                       "   FragColor = vec4(0.6f, 0.0f, 0.0f, 1.0f);n"
                                       "}n";
    m_program = new QOpenGLShaderProgram();
    m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,vertexShaderSource);
    m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
    m_program->link();
    m_mutex.lock();
    m_deckLinkScreenPreviewHelper->InitializeGL();
    m_mutex.unlock();
}
void VideoViewRenderer::paintGL()
{
    m_program->bind();
    glLoadIdentity();
    glClearColor(0.0f, 0.4f, 0.0f, 0.0f);
    glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());
    glClear(GL_COLOR_BUFFER_BIT);
    m_mutex.lock();
    m_deckLinkScreenPreviewHelper->PaintGL();
    m_mutex.unlock();
    m_program->release();
}

我应该如何更新我的着色器?

解决此问题的最简单方法是在屏幕上渲染形成正方形的两个三角形,而不是点。将这些三角形设置为纹理,并使用Decklink卡中的数据动态更改纹理缓冲区内容。

有关在 opengl 中使用视频帧的更多信息,请参阅此线程:如何将视频(帧(输入到 GLSL 着色器