首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

急求如何样在directshow里实时取每一桢,以及翻转90度

2012-12-15 
急求怎么样在directshow里实时取每一桢,以及翻转90度急求怎么样在directshow里实时取每一桢,而且要转换成Y

急求怎么样在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”,使为空
  
我的设置本来就是这个样子的

热点排行