我标记了directshow和directshow.net,因为我同时使用C++和C#创建源代码过滤器(用于在内存中加载位图),c#提供位图。
我在“这些引脚之间没有常见媒体类型”的问题上遇到了困难,因为源过滤器和渲染器用来连接,然后就没有了。源过滤器基本上是基于GSSF样本的。
在我的源代码过滤器中,我允许1种媒体类型:
AMOVIESETUP_MEDIATYPE sudMediaTypes[] =
{
{ &MEDIATYPE_Video, &MEDIASUBTYPE_ARGB32 }
};
然后设置给定位图信息头的媒体类型:
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#调用:
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;
发布于 2016-09-08 17:12:22
当过滤器无法协商媒体类型以流数据时,错误代码VFW_E_CANNOT_CONNECT
是典型的。可能有几个问题导致提到的错误场景。
首先,展示如何构建媒体类型。源滤波器的GetMediaType
和CheckMediaType
方法是很重要的,但也是很重要的。首先必须正确地公开这个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。
当您看到它无法连接并拒绝连接时,您有兴趣检查它拒绝的媒体类型,并提供完整的详细信息。
https://stackoverflow.com/questions/39395776
复制相似问题