捕获源过滤器 - 更改分辨率 [英] Capture Source Filter - Change Resolution
问题描述
我是Directshow Development的新手,我真的不需要了解太多。
I am pretty new to Directshow Development and I don't really need to know that much about it.
我修改了 示例 从http://tmhare.mvps.org/downloads.htm捕获源过滤器以使用图像文件。
实际上这就是我现在所需要的全部内容!
I modified the sample Capture Source Filter from http://tmhare.mvps.org/downloads.htm to use an image file.
Actually that is all I need for now!
默认媒体类型设置为320x240。
The default media type is set to 320x240.
现在我正在使用 VIDEOINFOHEADER和VIDEO_STREAM_CONFIG_CAPS属性将分辨率更改为我的图像分辨率。
但我无法弄清楚我必须更改哪些值。
Now I was playing around with the VIDEOINFOHEADER and VIDEO_STREAM_CONFIG_CAPS properties to change the resolution to my image resolution.
But I could not figure out which values I have to change.
欢呼
____
$
____
Filters.cpp:
Filters.cpp:
CVCamStream::CVCamStream(HRESULT *phr, CVCam *pParent, LPCWSTR pPinName) :
CSourceStream(NAME("Virtual Cam"),phr, pParent, pPinName), m_pParent(pParent)
{
// Set the default media type as 320x240x24@15
GetMediaType(4, &m_mt);
}
HRESULT CVCamStream :: GetMediaType(int iPosition,CMediaType * pmt)
{
if(iPosition< 0)返回E_INVALIDARG;
if(iPosition> 8)返回VFW_S_NO_MORE_ITEMS;
if(iPosition == 0)
{
* pmt = m_mt;
返回S_OK;
}
DECLARE_PTR(VIDEOINFOHEADER,pvi,pmt-> AllocFormatBuffer(sizeof(VIDEOINFOHEADER)));
ZeroMemory(pvi,sizeof(VIDEOINFOHEADER));
pvi-> bmiHeader.biCompression = BI_RGB;
pvi-> bmiHeader.biBitCount = 24;
pvi-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi-> bmiHeader.biWidth = 80 * iPosition;
pvi-> bmiHeader.biHeight = 60 * iPosition;
pvi-> bmiHeader.biPlanes = 1;
pvi-> bmiHeader.biSizeImage = GetBitmapSize(& pvi-> bmiHeader);
pvi-> bmiHeader.biClrImportant = 0;
pvi-> AvgTimePerFrame = 1000000;
SetRectEmpty(&(pvi-> rcSource)); //我们想要渲染整个图像区域。
SetRectEmpty(&(pvi-> rcTarget)); //没有特定的目标矩形
pmt-> SetType(& MEDIATYPE_Video);
pmt-> SetFormatType(& FORMAT_VideoInfo);
pmt-> SetTemporalCompression(FALSE);
//从标题信息中计算出子类型的GUID。
const GUID SubTypeGUID = GetBitmapSubtype(& pvi-> bmiHeader);
pmt-> SetSubtype(& SubTypeGUID);
pmt-> SetSampleSize(pvi-> bmiHeader.biSizeImage);
返回NOERROR;
} // GetMediaType
HRESULT CVCamStream :: CheckMediaType(const CMediaType * pMediaType)
{
VIDEOINFOHEADER * pvi =(VIDEOINFOHEADER *)(pMediaType - >格式());
if(* pMediaType!= m_mt)
返回E_INVALIDARG;
返回S_OK;
}
HRESULT CVCamStream::GetMediaType(int iPosition, CMediaType *pmt) { if(iPosition < 0) return E_INVALIDARG; if(iPosition > 8) return VFW_S_NO_MORE_ITEMS; if(iPosition == 0) { *pmt = m_mt; return S_OK; } DECLARE_PTR(VIDEOINFOHEADER, pvi, pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER))); ZeroMemory(pvi, sizeof(VIDEOINFOHEADER)); pvi->bmiHeader.biCompression = BI_RGB; pvi->bmiHeader.biBitCount = 24; pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pvi->bmiHeader.biWidth = 80 * iPosition; pvi->bmiHeader.biHeight = 60 * iPosition; pvi->bmiHeader.biPlanes = 1; pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader); pvi->bmiHeader.biClrImportant = 0; pvi->AvgTimePerFrame = 1000000; SetRectEmpty(&(pvi->rcSource)); // we want the whole image area rendered. SetRectEmpty(&(pvi->rcTarget)); // no particular destination rectangle pmt->SetType(&MEDIATYPE_Video); pmt->SetFormatType(&FORMAT_VideoInfo); pmt->SetTemporalCompression(FALSE); // Work out the GUID for the subtype from the header info. const GUID SubTypeGUID = GetBitmapSubtype(&pvi->bmiHeader); pmt->SetSubtype(&SubTypeGUID); pmt->SetSampleSize(pvi->bmiHeader.biSizeImage); return NOERROR; } // GetMediaType HRESULT CVCamStream::CheckMediaType(const CMediaType *pMediaType) { VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)(pMediaType->Format()); if(*pMediaType != m_mt) return E_INVALIDARG; return S_OK; }
HRESULT STDMETHODCALLTYPE CVCamStream :: GetStreamCaps(int iIndex,AM_MEDIA_TYPE ** pmt,BYTE * pSCC)
{
* pmt = CreateMediaType(& m_mt);
DECLARE_PTR(VIDEOINFOHEADER,pvi,(* pmt) - > pbFormat);
if(iIndex == 0)iIndex = 4;
pvi-> bmiHeader.biCompression = BI_RGB;
pvi-> bmiHeader.biBitCount = 24;
pvi-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi-> bmiHeader.biWidth = 80 * iIndex;
pvi-> bmiHeader.biHeight = 60 * iIndex;
pvi-> bmiHeader.biPlanes = 1;
pvi-> bmiHeader.biSizeImage = GetBitmapSize(& pvi-> bmiHeader);
pvi-> bmiHeader.biClrImportant = 0;
SetRectEmpty(&(pvi-> rcSource)); //我们想要渲染整个图像区域。
SetRectEmpty(&(pvi-> rcTarget)); //没有特定的目标矩形
(* pmt) - > majortype = MEDIATYPE_Video;
(* pmt) - > subtype = MEDIASUBTYPE_RGB24;
(* pmt) - > formattype = FORMAT_VideoInfo;
(* pmt) - > bTemporalCompression = FALSE;
(* pmt) - > bFixedSizeSamples = FALSE;
(* pmt) - > lSampleSize = pvi-> bmiHeader.biSizeImage;
(* pmt) - > cbFormat = sizeof(VIDEOINFOHEADER);
DECLARE_PTR(VIDEO_STREAM_CONFIG_CAPS,pvscc,pSCC);
pvscc-> guid = FORMAT_VideoInfo;
pvscc-> VideoStandard = AnalogVideo_None;
pvscc-> InputSize.cx = 640;
pvscc-> InputSize.cy = 480;
pvscc-> MinCroppingSize.cx = 80;
pvscc-> MinCroppingSize.cy = 60;
pvscc-> MaxCroppingSize.cx = 640;
pvscc-> MaxCroppingSize.cy = 480;
pvscc-> CropGranularityX = 80;
pvscc-> CropGranularityY = 60;
pvscc-> CropAlignX = 0;
pvscc-> CropAlignY = 0;
pvscc-> MinOutputSize.cx = 80;
pvscc-> MinOutputSize.cy = 60;
pvscc-> MaxOutputSize.cx = 640;
pvscc-> MaxOutputSize.cy = 480;
pvscc-> OutputGranularityX = 0;
pvscc-> OutputGranularityY = 0;
pvscc-> StretchTapsX = 0;
pvscc-> StretchTapsY = 0;
pvscc-> ShrinkTapsX = 0;
pvscc-> ShrinkTapsY = 0;
pvscc-> MinFrameInterval = 200000; // 50 fps
pvscc-> MaxFrameInterval = 50000000; // 0.2 fps
pvscc-> MinBitsPerSecond =(80 * 60 * 3 * 8)/ 5;
pvscc-> MaxBitsPerSecond = 640 * 480 * 3 * 8 * 50;
返回S_OK;
}
HRESULT STDMETHODCALLTYPE CVCamStream::GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC)
{
*pmt = CreateMediaType(&m_mt);
DECLARE_PTR(VIDEOINFOHEADER, pvi, (*pmt)->pbFormat);
if (iIndex == 0) iIndex = 4;
pvi->bmiHeader.biCompression = BI_RGB;
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = 80 * iIndex;
pvi->bmiHeader.biHeight = 60 * iIndex;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biClrImportant = 0;
SetRectEmpty(&(pvi->rcSource)); // we want the whole image area rendered.
SetRectEmpty(&(pvi->rcTarget)); // no particular destination rectangle
(*pmt)->majortype = MEDIATYPE_Video;
(*pmt)->subtype = MEDIASUBTYPE_RGB24;
(*pmt)->formattype = FORMAT_VideoInfo;
(*pmt)->bTemporalCompression = FALSE;
(*pmt)->bFixedSizeSamples= FALSE;
(*pmt)->lSampleSize = pvi->bmiHeader.biSizeImage;
(*pmt)->cbFormat = sizeof(VIDEOINFOHEADER);
DECLARE_PTR(VIDEO_STREAM_CONFIG_CAPS, pvscc, pSCC);
pvscc->guid = FORMAT_VideoInfo;
pvscc->VideoStandard = AnalogVideo_None;
pvscc->InputSize.cx = 640;
pvscc->InputSize.cy = 480;
pvscc->MinCroppingSize.cx = 80;
pvscc->MinCroppingSize.cy = 60;
pvscc->MaxCroppingSize.cx = 640;
pvscc->MaxCroppingSize.cy = 480;
pvscc->CropGranularityX = 80;
pvscc->CropGranularityY = 60;
pvscc->CropAlignX = 0;
pvscc->CropAlignY = 0;
pvscc->MinOutputSize.cx = 80;
pvscc->MinOutputSize.cy = 60;
pvscc->MaxOutputSize.cx = 640;
pvscc->MaxOutputSize.cy = 480;
pvscc->OutputGranularityX = 0;
pvscc->OutputGranularityY = 0;
pvscc->StretchTapsX = 0;
pvscc->StretchTapsY = 0;
pvscc->ShrinkTapsX = 0;
pvscc->ShrinkTapsY = 0;
pvscc->MinFrameInterval = 200000; //50 fps
pvscc->MaxFrameInterval = 50000000; // 0.2 fps
pvscc->MinBitsPerSecond = (80 * 60 * 3 * 8) / 5;
pvscc->MaxBitsPerSecond = 640 * 480 * 3 * 8 * 50;
return S_OK;
}
推荐答案
老实说,如果你不这样做知道DirectShow然后你最好不要学习它。这是一个弃用的API。
To be honest, if you don't know DirectShow then you are better off not learning it. It is a deprecated API.
你会更好地学习
Microsoft Media Foundation 做你想做的事。
You would do much better to learn the Microsoft Media Foundation to do what you are trying to do.
这篇关于捕获源过滤器 - 更改分辨率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!