.NET用のDirectShowコードをラップするのに使用します。 DirectShowでは/ 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は1つの解像度しか返しません。これはカメラにとって最高です...私の疑惑は、デバイスドライバのフォーマットダイアログを表示するときに表示される他の解像度は、圧縮フィルタ。私はこれらをプログラムで取得/設定する方法が不明です。何か案は? – Cat
私の経験では、DirectShowソースフィルタは、デバイスによってサポートされている解像度またはフレームレートまたはサイズを実装するとは限りません。 DirectShowのソースフィルタの機能を簡単に検証するために、私はカスタムコードを書く前にグラフ編集でそれを行うのに使っています。 ダウンロードしてインストールし、ソースフィルタを追加し、キャプチャピンのプロパティを検証してサポートされているソース機能を調べます。 – Bafro