首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当两个引脚都接受ARGB32媒体类型时,两者之间没有组合

当两个引脚都接受ARGB32媒体类型时,两者之间没有组合
EN

Stack Overflow用户
提问于 2016-09-08 16:12:15
回答 1查看 131关注 0票数 3

我标记了directshow和directshow.net,因为我同时使用C++和C#创建源代码过滤器(用于在内存中加载位图),c#提供位图。

我在“这些引脚之间没有常见媒体类型”的问题上遇到了困难,因为源过滤器和渲染器用来连接,然后就没有了。源过滤器基本上是基于GSSF样本的。

在我的源代码过滤器中,我允许1种媒体类型:

代码语言:javascript
运行
复制
AMOVIESETUP_MEDIATYPE sudMediaTypes[] =
{
    { &MEDIATYPE_Video, &MEDIASUBTYPE_ARGB32 }
};

然后设置给定位图信息头的媒体类型:

代码语言:javascript
运行
复制
HRESULT CPushPinBitmap::CreateMediaTypeFromBMI(BITMAPINFOHEADER *bmi, LONGLONG lFPS)
{
    auto pvi = reinterpret_cast<VIDEOINFOHEADER*>(m_amt.AllocFormatBuffer(SIZE_PREHEADER + bmi->biSize));

    if (pvi == nullptr)
    {
        return E_OUTOFMEMORY;
    }

    ZeroMemory(pvi, m_amt.cbFormat);
    pvi->AvgTimePerFrame = lFPS;
    memcpy(&pvi->bmiHeader, bmi, bmi->biSize);
    m_lBufferSize = GetBitmapSize(&pvi->bmiHeader);
    pvi->bmiHeader.biSizeImage = m_lBufferSize;
    pvi->dwBitRate = m_lBufferSize * static_cast<DWORD>(static_cast<float>(UNITS) / pvi->AvgTimePerFrame) * 8;

    SetRectEmpty(&pvi->rcSource);
    SetRectEmpty(&pvi->rcTarget);

    m_amt.SetType(&MEDIATYPE_Video);
    m_amt.SetSubtype(&MEDIASUBTYPE_ARGB32);
    m_amt.SetFormatType(&FORMAT_VideoInfo);
    m_amt.SetSampleSize(bmi->biSizeImage);
    m_amt.SetTemporalCompression(FALSE);

    return S_OK;
}

CreateMediaTypeFromBMI从C#调用:

代码语言:javascript
运行
复制
public void SetMediaType(ISourceConfig sourceConfig)
{
    var bmi = new BitmapInfoHeader();

    if (bitmap == null)
    {
        int i;
        GetImage(0, IntPtr.Zero, 0, out i);
    }

    bmi.Size = Marshal.SizeOf(typeof(BitmapInfoHeader));
    bmi.Width = bitmapData.Width;
    bmi.Height = bitmapData.Height * -1;
    bmi.Planes = 1;
    bmi.BitCount = 32;
    bmi.Compression = 0;
    bmi.ImageSize = bmi.Width * bmi.Height * bmi.BitCount / 8;
    bmi.XPelsPerMeter = 0;
    bmi.YPelsPerMeter = 0;
    bmi.ClrUsed = 0;
    bmi.ClrImportant = 0;

    var hr = sourceConfig.SetMediaTypeFromBitmap(bmi, fps);
    DsError.ThrowExceptionForHR(hr);
}

调用ConnectDirect后,我得到0x80040207。如果我调用RenderStream,我得到了0x80040217,这告诉我同样的事情,媒体类型无效。

然后是渲染器过滤器,它是由BlackMagicDesign提供的用于捕获和呈现的decklink呈现器。此呈现器支持5种不同类型的媒体,其中第4种类型表示ARGB32的子类型guid。

所以我的问题是,如果呈现支持ARGB32,并且我告诉源代码过滤器它的输出引脚是使用视频的ARGB32,那么directshow如何告诉我这些引脚之间没有常见的媒体类型?

哦,我应该注意到fps变量= 10000000 / 30;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-08 17:12:22

当过滤器无法协商媒体类型以流数据时,错误代码VFW_E_CANNOT_CONNECT是典型的。可能有几个问题导致提到的错误场景。

首先,展示如何构建媒体类型。源滤波器的GetMediaTypeCheckMediaType方法是很重要的,但也是很重要的。首先必须正确地公开这个RGB媒体类型,而另一个应该接受它。

您可以使用GraphEdit/GraphStudioNext检查应用程序的这一部分,以验证来自您的引脚的视频是否可呈现到标准视频呈现器(Non)。

其次,您正在做自上而下的RGB帧(负biHeight),我最好的猜测是Decklink渲染器不接受这个布局。典型的RGB排序是反向的,自下而上的.当股票呈现器经常帮助您并提供兼容的媒体类型时,尝试协商一些双方都可以接受的内容(或通过转换)时,Decklink呈现程序并不那么灵活,因此可能会拒绝此RGB媒体类型。你可能需要自下而上,至少要排除这种可能性。

第三,除了上面提到的Decklink渲染器的灵活性外,该硬件还要求视频格式与有线上的视频参数直接兼容。它不会像VMR/EVR滤波器那样缩放视频,视频应该严格按照规格、分辨率和帧速率进行调整。您必须确保您在媒体类型中给出了准确的值。例如,硬件可能只能以50、59.94、60的速率接受1280x720,而不接受25或30 fps的媒体类型。如果是NTSC SD视频,那么速度应该是29.97,而不是30。

当您看到它无法连接并拒绝连接时,您有兴趣检查它拒绝的媒体类型,并提供完整的详细信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39395776

复制
相关文章

相似问题

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