急求怎么样在directshow里实时取每一桢,以及翻转90度
急求怎么样在directshow里实时取每一桢,而且要转换成YUV格式的,我在网上看到一下资料是用ISampleGrabber的,但wm不支持ISampleGrabber.还有我在Preview发现图像转了90度,在网上看到了一些资料说要在CTransformFilter里翻转,但我写了一个类继承CTransformFilter时出现了error C2512: 'CTransformFilter' : no appropriate default constructor available,急求大家指点一下,最好是有代码例子的,谢谢大家了.唉,刚刚接触directshow, 项目又紧
[解决办法]
error C2512: 'CTransformFilter' : no appropriate default constructor available的问题是我自己加了构造函数去掉后出现下面的错误
1>CameraCap.obj : error LNK2019: unresolved external symbol "public: __cdecl CTransformFilter::CTransformFilter(wchar_t *,struct IUnknown *,struct _GUID const &)" (??0CTransformFilter@@QAA@PA_WPAUIUnknown@@ABU_GUID@@@Z) referenced in function "public: __cdecl CCRotateFilter::CCRotateFilter(struct IUnknown *,long *)" (??0CCRotateFilter@@QAA@PAUIUnknown@@PAJ@Z)
1>CameraCap.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __cdecl CBaseFilter::NonDelegatingRelease(void)" (?NonDelegatingRelease@CBaseFilter@@UAAKXZ)
1>CameraCap.obj : error LNK2001: unresolved external symbol "public: virtual long __cdecl CTransformFilter::FindPin(wchar_t const *,struct IPin * *)" (?FindPin@CTransformFilter@@UAAJPB_WPAPAUIPin@@@Z)
1>CameraCap.obj : error LNK2001: unresolved external symbol "public: virtual long __cdecl CBaseFilter::JoinFilterGraph(struct IFilterGraph *,wchar_t const *)" (?JoinFilterGraph@CBaseFilter@@UAAJPAUIFilterGraph@@PB_W@Z)
1>CameraCap.obj : error LNK2001: unresolved external symbol "public: virtual long __cdecl CBaseFilter::QueryVendorInfo(wchar_t * *)" (?QueryVendorInfo@CBaseFilter@@UAAJPAPA_W@Z)
[解决办法]
这个错像是头文件的问题啊。
[解决办法]
头文件???
我在.h中的申明
#pragma once
EXTERN_GUID(CLSID_MyFilter,0x00780718, 0x8864, 0x4a60, 0xb2, 0x6c, 0x55, 0x2f, 0x9a, 0xa4,0x72, 0xe2);
class CCRotateFilter : CTransformFilter
{
public:
DECLARE_IUNKNOWN;
CCRotateFilter(LPUNKNOWN pUnk, HRESULT* phr) :
CTransformFilter(NAME("My Filter1"), pUnk, CLSID_MyFilter)
{
m_lWidth = 0;
m_lHeight = 0;
m_biBitCount = 0;
m_biCompression = 0;
m_cbWidth = 0;
m_cbHeight = 0;
}
HRESULT CheckInputType(const CMediaType * mtIn);
HRESULT GetMediaType(int iPos, CMediaType * pmt);
HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut);
HRESULT DecideBufferSize(IMemAllocator * pima, ALLOCATOR_PROPERTIES * pProperties);
HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);
private:
long m_lWidth;//每行总像素数
long m_lHeight;//
long m_cbWidth;//每行总字节数(16位色:m_cbWidth = 2*m_lWidth)
long m_cbHeight;//
WORD m_biBitCount;
DWORD m_biCompression;
};
.cpp中是
#include "stdafx.h"
//#include "streams.h"
#include "RotateFilter.h"
HRESULT CCRotateFilter::CheckInputType(const CMediaType * mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video)
[解决办法]
(mtIn->subtype != MEDIASUBTYPE_RGB565)
[解决办法]
(mtIn->formattype != FORMAT_VideoInfo)
[解决办法]
(mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
m_biBitCount = pVih->bmiHeader.biBitCount;
m_biCompression = pVih->bmiHeader.biCompression;
m_lWidth = pVih->bmiHeader.biWidth;
m_lHeight = pVih->bmiHeader.biHeight;
m_cbWidth = m_biBitCount*m_lWidth/8;
m_cbHeight = m_biBitCount*m_lHeight/8;
return S_OK;
}
HRESULT CCRotateFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
if (iPosition < 0)
{
return E_INVALIDARG;
}
if (iPosition >= 1)
{
return VFW_S_NO_MORE_ITEMS;
}
if (m_pInput->IsConnected() == FALSE)
{
return E_UNEXPECTED;
}
HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
//*pMediaType = m_pInput->CurrentMediaType();
//pMediaType->subtype = MEDIASUBTYPE_RGB565;
//pMediaType->SetVariableSize();
//pMediaType->SetTemporalCompression(FALSE);
ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
VIDEOINFOHEADER *pVih =
reinterpret_cast <VIDEOINFOHEADER*> (pMediaType->pbFormat);
//pVih->bmiHeader.biCompression = m_biCompression;
//pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);
pVih->bmiHeader.biWidth = m_lHeight;
pVih->bmiHeader.biHeight = m_lWidth;
return S_OK;
}
HRESULT CCRotateFilter::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)
{
if (mtOut->majortype != MEDIATYPE_Video)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
if (mtOut->subtype != MEDIASUBTYPE_RGB565)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
if ((mtOut->formattype != FORMAT_VideoInfo)
[解决办法]
(mtOut->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
return S_OK;
}
HRESULT CCRotateFilter::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProperties)
{
if (m_pInput->IsConnected() == FALSE)
{
return E_UNEXPECTED;
}
CheckPointer(pAlloc,E_POINTER);
CheckPointer(pProperties,E_POINTER);
HRESULT hr = NOERROR;
pProperties->cBuffers = 1;
pProperties->cbBuffer = m_pInput->CurrentMediaType().GetSampleSize();
ASSERT(pProperties->cbBuffer);
ALLOCATOR_PROPERTIES Actual;
hr = pAlloc->SetProperties(pProperties,&Actual);
if (FAILED(hr))
{
return hr;
}
ASSERT( Actual.cBuffers == 1 );
if (pProperties->cBuffers > Actual.cBuffers
[解决办法]
pProperties->cbBuffer > Actual.cbBuffer)
{
return E_FAIL;
}
return NOERROR;
}
HRESULT CCRotateFilter::Transform(IMediaSample *pSource, IMediaSample *pDest)
{
HRESULT hr = S_OK;
BYTE *pBufferIn, *pBufferOut;
hr = pSource-> GetPointer(&pBufferIn);
if (FAILED(hr))
{
return hr;
}
hr = pDest-> GetPointer(&pBufferOut);
if (FAILED(hr))
{
return hr;
}
// 直接copy, 不做转换
//memcpy(pBufferOut, pBufferIn, 2*m_lHeight*m_lWidth);
// 图像数据旋转90°(不同的机器可能旋转的方向不同,请自行调整loop变量起始值)
// 这里只支持16bit的RGB颜色空间,如RGB565,RGB555
int k = 0;
for(int i = 0; i< m_lWidth; i++)
{
for(int j = m_lHeight - 1; j >= 0;j--)
{
pBufferOut[k] = pBufferIn[2*i + j*m_cbWidth];//16bits
k++;
pBufferOut[k] = pBufferIn[2*i + j*m_cbWidth + 1];
k++;
}
}
return NOERROR;
}
[解决办法]
在网上看说可能是字节方面的问题
1)/Zc:wchar
解决办法:C/C++/Language/Treat wchar_t as built in type选为 Yes (/Zc:wchar_t)
2)/ENTRY:"WinMainCRTStartup"
解决办法:Linker->Advanced->Entry point 去掉“WinMainCRTStartup”,使为空
我的设置本来就是这个样子的