Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 当两个管脚都接受ARGB32介质类型时,管脚之间没有组合 我已经标记了DirectShow和DirectShow .NET,因为我使用C++和C++来创建一个源过滤器(用于在内存中加载位图),而C是提供位图。_Video_Directshow_Directshow.net - Fatal编程技术网

Video 当两个管脚都接受ARGB32介质类型时,管脚之间没有组合 我已经标记了DirectShow和DirectShow .NET,因为我使用C++和C++来创建一个源过滤器(用于在内存中加载位图),而C是提供位图。

Video 当两个管脚都接受ARGB32介质类型时,管脚之间没有组合 我已经标记了DirectShow和DirectShow .NET,因为我使用C++和C++来创建一个源过滤器(用于在内存中加载位图),而C是提供位图。,video,directshow,directshow.net,Video,Directshow,Directshow.net,由于源过滤器和渲染器用于连接,所以我一直被“这些管脚之间没有公共媒体类型”这一问题困扰了好几天。源过滤器主要基于GSSF样本 在我的源过滤器中,我允许1种媒体类型: AMOVIESETUP\u MEDIATYPE sudMediaTypes[]= { {&MEDIATYPE_视频,&MEDIASUBTYPE_ARGB32} }; 然后根据位图信息标题设置媒体类型: HRESULT CPushPinBitmap::CreateMediaTypeFromBMI(BitMapInfo头文件*bmi,

由于源过滤器和渲染器用于连接,所以我一直被“这些管脚之间没有公共媒体类型”这一问题困扰了好几天。源过滤器主要基于GSSF样本

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

AMOVIESETUP\u MEDIATYPE sudMediaTypes[]=
{
{&MEDIATYPE_视频,&MEDIASUBTYPE_ARGB32}
};
然后根据位图信息标题设置媒体类型:

HRESULT CPushPinBitmap::CreateMediaTypeFromBMI(BitMapInfo头文件*bmi,LONGLONG lFPS)
{
自动pvi=重新解释投射(m_数量AllocFormatBuffer(尺寸预读数+bmi->biSize));
如果(pvi==nullptr)
{
返回E_OUTOFMEMORY;
}
零内存(pvi、m_amt.cbFormat);
pvi->AvgTimePerFrame=lFPS;
memcpy(&pvi->bmiHeader,bmi,bmi->biSize);
m_lBufferSize=GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biSizeImage=mlbufferSize;
pvi->dwBitRate=m_lBufferSize*静态施法(静态施法(单位)/pvi->AvgTimePerFrame)*8;
SetRectEmpty(&pvi->rcSource);
SetRectEmpty(&pvi->rcTarget);
m_amt.SetType(和MEDIATYPE_视频);
m_amt.SetSubtype(&MEDIASUBTYPE_ARGB32);
m_amt.SetFormatType(&FORMAT_VideoInfo);
m_amt.SetSampleSize(bmi->biSizeImage);
m_.金额设置临时压缩(假);
返回S_OK;
}
CreateMediaTypeFromBMI是从C#调用的:

public void SetMediaType(ISourceConfig sourceConfig)
{
var bmi=新的BitMapInfo头();
如果(位图==null)
{
int i;
GetImage(0,IntPtr.Zero,0,out i);
}
bmi.Size=Marshal.SizeOf(typeof(BitMapInfo头));
bmi.Width=位图数据.Width;
bmi.Height=bitmapData.Height*-1;
bmi.平面=1;
bmi.BitCount=32;
bmi.压缩=0;
bmi.ImageSize=bmi.Width*bmi.Height*bmi.BitCount/8;
bmi.XPelsPerMeter=0;
bmi.YPelsPerMeter=0;
体重指数=0;
体重指数=0;
var hr=sourceConfig.SetMediaTypeFromBitmap(bmi,fps);
DsError.THROWEExceptionForHR(hr);
}
调用ConnectDirect后,我得到0x80040207。如果我调用RenderStream,我会得到0x80040217,这告诉我同样的事情,即媒体类型无效

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

所以我的问题是,如果渲染支持ARGB32,并且我告诉源过滤器其输出管脚是使用视频的ARGB32,那么directshow如何告诉我这些管脚之间没有公共媒体类型


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

错误代码
VFW_E_CANNOT_CONNECT
是过滤器无法协商媒体类型以传输数据的典型情况。可能有几个问题导致上述错误场景

首先,展示如何构建媒体类型。源过滤器的
GetMediaType
CheckMediaType
方法所做的事情很重要,但也很重要。首先必须正确地公开此RGB媒体类型,另一个应该接受它

您可以使用GraphEdit/GraphStudioNext检查应用程序的这一部分,以验证pin中的视频是否可渲染到标准视频渲染器(非Decklink)

其次,您正在执行从上到下的RGB帧(负
biHeight
),我最好的猜测是Decklink渲染器不接受此布局。典型的RGB顺序是从下到上的反向排列。当库存渲染器经常帮助您并提供兼容的媒体类型,试图协商双方都可以接受的内容(或通过转换),Decklink渲染器没有那么灵活,可能会因此拒绝此RGB媒体类型。您可能需要尝试从下到上,至少要排除这种可能性

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


当您看到它的渲染器无法连接并拒绝连接时,您感兴趣的是使用完整的详细信息检查它拒绝的媒体类型

罗曼,你的第三点是令人惊讶的。我最终改变了720便士的价格,根本没有考虑计算!标记为已回答。非常感谢你。干杯