捕获源过滤器 - 更改分辨率 [英] Capture Source Filter - Change Resolution

查看:109
本文介绍了捕获源过滤器 - 更改分辨率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是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) - > bFix​​edSizeSamples = 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆