我用來包裝.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
https://msdn.microsoft.com/en -us/library/windows/desktop/dd319784(v = vs.85).aspx – Bafro
感謝您的回覆。使用C#.NET和Accord.Video.DirectShow庫,IAMStreamConfig.GetNumberOfCapabilities只返回一個分辨率 - 相機的最高分辨率......所以我懷疑顯示設備驅動程序格式對話框時顯示的其他分辨率實際上是由一個壓縮過濾器。我不確定如何以編程方式獲取/設置。有任何想法嗎? – Cat
對於我的經驗DirectShow源過濾器不總是實現任何分辨率或設備支持的幀速率或大小。 爲了輕鬆驗證DirectShow源代碼過濾器的功能,我使用它來編輯圖形,然後編寫自定義代碼。 只需下載並安裝它,添加源過濾器並查看捕獲引腳屬性以驗證支持的源功能。 – Bafro