C# 使用Accord.Video.DirectShow获取相机分辨率
我正在评估用于成像应用程序的Accord.NET框架()。目前,我有一些基本要求-从USB摄像头捕获视频以显示在UI上,并查看/更改所有摄像头属性 Accord.Video.DirectShow.VideoCaptureDevice.DisplayProperty页面可以很好地显示相机属性,如亮度、对比度、色调等,但不显示可用的相机分辨率 Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities只返回一个分辨率,但我还期待着多个分辨率 我尝试过VideoCapx()ActiveX控件,使用它的ShowVideoFormatDlg方法,我可以显示一个对话框,其中显示所有可用的分辨率、帧率等。我知道这是一个由制造商提供并通过OLE\COM访问的对话框。我正在寻找的是一种通过.NET访问此文件的方法,希望通过Accord框架C# 使用Accord.Video.DirectShow获取相机分辨率,c#,.net,directshow,accord.net,C#,.net,Directshow,Accord.net,我正在评估用于成像应用程序的Accord.NET框架()。目前,我有一些基本要求-从USB摄像头捕获视频以显示在UI上,并查看/更改所有摄像头属性 Accord.Video.DirectShow.VideoCaptureDevice.DisplayProperty页面可以很好地显示相机属性,如亮度、对比度、色调等,但不显示可用的相机分辨率 Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities只返回一个分辨率,但我还期待着多个分辨
我知道额外的分辨率可能是转换过滤器的属性,但是我对.NET中的DirectShow和COM接口不熟悉,因此我正在寻找一些指针。我用于包装.NET的DirectShow代码。 当然,使用DirectShow可以获取、设置和检索a/v源功能。 您是否尝试过使用IAMStreamConfig视频接口在某些捕获和压缩过滤器上设置输出格式 我使用这段代码来获得分辨率,并将其设置在不同的源上。 其中m_pVCap:源过滤器
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,
m_pVCap, IID_IAMVideoCompression,(void **)&m_pVC);
if (hr != S_OK)
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVCap,IID_IAMVideoCompression,(void **)&m_pVC);
// !!! What if this interface isn't supported?
// we use this interface to set the frame rate and get the capture size
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,
m_pVCap, IID_IAMStreamConfig, (void **)&m_pVSC);
if (hr != NOERROR)
{
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVCap, IID_IAMStreamConfig,(void **)&m_pVSC);
if (hr != NOERROR)
{
LogDXError(hr, false, FILELINE);
}
}
获取当前源格式的步骤
hr = m_pVSC->GetFormat(&pmt);
// DV capture does not use a VIDEOINFOHEADER
if (hr == NOERROR)
{
if (pmt->formattype == FORMAT_VideoInfo)
{
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)pmt->pbFormat;
pvi->AvgTimePerFrame = (LONGLONG)(10000000 / m_FrameRate);
hr = m_pVSC->SetFormat(pmt);
if (hr != NOERROR)
(NotifyNewError) (FILELINE, "", LOG_ALL, ERR_GRAVE, false,
"Cannot set frame rate for capture");
hr = m_pVSC->GetFormat(&pmt);
pvi = (VIDEOINFOHEADER *)pmt->pbFormat;
pvi->bmiHeader.biWidth = g_SizeOutput.cx;
pvi->bmiHeader.biHeight = g_SizeOutput.cy;
pvi->bmiHeader.biSizeImage = DIBSIZE(pvi->bmiHeader);
hr = m_pVSC->SetFormat(pmt);
if (hr != NOERROR)
{
char ErrTxt[MAX_ERROR_TEXT_LEN];
AMGetErrorText(hr, ErrTxt,MAX_ERROR_TEXT_LEN);
wsprintf(szError, "Error %x: %s\nCannot set frame rate (%d)for
prev", hr, ErrTxt,m_FrameRate);
(NotifyNewError)(FILELINE, "", LOG_ALL, ERR_GRAVE, false, szError);
}
DeleteMediaType(pmt);
}
要获取源功能,您可以使用:
IAMStreamConfig::GetNumberOfCapabilities and then IAMStreamConfig::GetStreamCaps
我用来包装.NET的DirectShow代码。 当然,使用DirectShow可以获取、设置和检索a/v源功能。 您是否尝试过使用IAMStreamConfig视频接口在某些捕获和压缩过滤器上设置输出格式 我使用这段代码来获得分辨率,并将其设置在不同的源上。 其中m_pVCap:源过滤器
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,
m_pVCap, IID_IAMVideoCompression,(void **)&m_pVC);
if (hr != S_OK)
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVCap,IID_IAMVideoCompression,(void **)&m_pVC);
// !!! What if this interface isn't supported?
// we use this interface to set the frame rate and get the capture size
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,
m_pVCap, IID_IAMStreamConfig, (void **)&m_pVSC);
if (hr != NOERROR)
{
hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVCap, IID_IAMStreamConfig,(void **)&m_pVSC);
if (hr != NOERROR)
{
LogDXError(hr, false, FILELINE);
}
}
获取当前源格式的步骤
hr = m_pVSC->GetFormat(&pmt);
// DV capture does not use a VIDEOINFOHEADER
if (hr == NOERROR)
{
if (pmt->formattype == FORMAT_VideoInfo)
{
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)pmt->pbFormat;
pvi->AvgTimePerFrame = (LONGLONG)(10000000 / m_FrameRate);
hr = m_pVSC->SetFormat(pmt);
if (hr != NOERROR)
(NotifyNewError) (FILELINE, "", LOG_ALL, ERR_GRAVE, false,
"Cannot set frame rate for capture");
hr = m_pVSC->GetFormat(&pmt);
pvi = (VIDEOINFOHEADER *)pmt->pbFormat;
pvi->bmiHeader.biWidth = g_SizeOutput.cx;
pvi->bmiHeader.biHeight = g_SizeOutput.cy;
pvi->bmiHeader.biSizeImage = DIBSIZE(pvi->bmiHeader);
hr = m_pVSC->SetFormat(pmt);
if (hr != NOERROR)
{
char ErrTxt[MAX_ERROR_TEXT_LEN];
AMGetErrorText(hr, ErrTxt,MAX_ERROR_TEXT_LEN);
wsprintf(szError, "Error %x: %s\nCannot set frame rate (%d)for
prev", hr, ErrTxt,m_FrameRate);
(NotifyNewError)(FILELINE, "", LOG_ALL, ERR_GRAVE, false, szError);
}
DeleteMediaType(pmt);
}
要获取源功能,您可以使用:
IAMStreamConfig::GetNumberOfCapabilities and then IAMStreamConfig::GetStreamCaps
谢谢你的回复。使用C#.NET和Accord.Video.DirectShow库,IAMStreamConfig.GetNumberOfCapabilities只返回一个分辨率-相机的最高分辨率。。。所以我怀疑显示设备驱动程序格式对话框时显示的其他分辨率实际上是由压缩过滤器提供的。我不确定如何以编程方式获取/设置这些。有什么想法吗?根据我的经验,DirectShow源代码过滤器并不总是实现设备支持的任何分辨率、帧速率或大小。为了方便地验证DirectShow源代码过滤功能,在编写自定义代码之前,我使用Graph edit进行了验证。只需下载并安装它,在其上添加源过滤器,并查看捕获pin属性,以验证支持的源功能。我已使用IAMStreamConfig和ISPecifyPropertyPage成功显示设备视频格式对话框,现在就可以了。我认为您是正确的,必须编写自定义代码来提取所有不被视为标准的受支持功能。谢谢您的帮助。请考虑将您的解决方案作为您自己的问题的答案,这样将来的用户也可以从中受益。谢谢你的回复。使用C#.NET和Accord.Video.DirectShow库,IAMStreamConfig.GetNumberOfCapabilities只返回一个分辨率-相机的最高分辨率。。。所以我怀疑显示设备驱动程序格式对话框时显示的其他分辨率实际上是由压缩过滤器提供的。我不确定如何以编程方式获取/设置这些。有什么想法吗?根据我的经验,DirectShow源代码过滤器并不总是实现设备支持的任何分辨率、帧速率或大小。为了方便地验证DirectShow源代码过滤功能,在编写自定义代码之前,我使用Graph edit进行了验证。只需下载并安装它,在其上添加源过滤器,并查看捕获pin属性,以验证支持的源功能。我已使用IAMStreamConfig和ISPecifyPropertyPage成功显示设备视频格式对话框,现在就可以了。我认为您是正确的,必须编写自定义代码来提取所有不被视为标准的受支持功能。谢谢您的帮助。请考虑将您的解决方案作为您自己的问题的答案,这样将来的用户也可以从中受益。