参考:http://blog.csdn.net/luckyboy101/article/details/7836693

http://blog.csdn.net/luckyboy101/article/details/7841673

其它不解释,贴是代码:

IPFilter.h

//
// Sample DirectShow In-Place Transform Filter that accepts data for use in application
//#include <streams.h>// This is an example transform filter that is created within
// the application, and not by CoCreateInstance
class CAppTransform : public CTransformFilter
{
public:CAppTransform(LPUNKNOWN pUnkOuter, HRESULT *phr);HRESULT CheckInputType(const CMediaType* mtIn);HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);HRESULT CheckTransform(const CMediaType *mtIn,const CMediaType *mtOut);HRESULT DecideBufferSize(IMemAllocator *pAlloc,ALLOCATOR_PROPERTIES *pProperties);HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
private:HRESULT Copy(IMediaSample *pSource, IMediaSample *pDest) const;HRESULT Transform(IMediaSample *pSample);
};// DirectShow graph management sample code:
// This builds a playback graph using RenderFile
// and then inserts a transform filter on the uncompressed video.
class CAppGraphBuilder
{
private:CAppTransform*   m_pFilter;DWORD             m_dwObjectTable; ICaptureGraphBuilder2 *m_pBuild;IGraphBuilder *m_pGraph;public:CAppGraphBuilder();~CAppGraphBuilder();void DestroyGraph(void);HRESULT BuildFromFile(LPCWSTR pszFile);HRESULT Run(void);HRESULT MakeChild(HWND hwnd);HRESULT ResizeVideoWindow(RECT* prc);private:void CreateAppFilter(void);HRESULT FindFilterByInterface(REFIID riid, IBaseFilter** ppFilter);HRESULT ConnectUpstreamOf(IBaseFilter* pFilter,IBaseFilter*pColor, IBaseFilter* pTransform);HRESULT NextUpstream(IBaseFilter* pFilter, IBaseFilter** ppNext);  HRESULT CAppGraphBuilder::AddFilterByCLSID(IGraphBuilder *pGraph,const GUID& clsid,LPCWSTR wszName,IBaseFilter **ppF);HRESULT InitCaptureGraphBuilder(IGraphBuilder **ppGraph,ICaptureGraphBuilder2 **ppBuild);HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum);void DisplayDeviceInformation(IEnumMoniker *pEnum, IMoniker** pMoniker);IPin* GetPin(IBaseFilter* pFilter, PIN_DIRECTION dirRequest);// Helper methodsIPin* InputPinOf(IBaseFilter* pFilter) {return GetPin(pFilter, PINDIR_INPUT);}IPin* OutputPinOf(IBaseFilter* pFilter) {return GetPin(pFilter, PINDIR_OUTPUT);}void AddToObjectTable(void) ;void RemoveFromObjectTable(void);
};

IPFilter.cpp

//
// Sample DirectShow Transform Filter that accepts data for use in application
//#include "stdafx.h"
#include "IPFilter.h"CAppTransform::CAppTransform(LPUNKNOWN pUnkOuter, HRESULT *phr) :
CTransformFilter(NAME("App Transform"), pUnkOuter, GUID_NULL)
{
}
//
// CheckTransform
//
// To be able to transform the formats must be identical
//
HRESULT CAppTransform::CheckTransform(const CMediaType *mtIn,const CMediaType *mtOut)
{CheckPointer(mtIn,E_POINTER);CheckPointer(mtOut,E_POINTER);HRESULT hr;if(FAILED(hr = CheckInputType(mtIn))){return hr;}// format must be a VIDEOINFOHEADERif(*mtOut->FormatType() != FORMAT_VideoInfo){return E_INVALIDARG;}// formats must be big enough if(mtIn->FormatLength() < sizeof(VIDEOINFOHEADER) ||mtOut->FormatLength() < sizeof(VIDEOINFOHEADER))return E_INVALIDARG;VIDEOINFO *pInput  = (VIDEOINFO *) mtIn->Format();VIDEOINFO *pOutput = (VIDEOINFO *) mtOut->Format();if(memcmp(&pInput->bmiHeader,&pOutput->bmiHeader,sizeof(BITMAPINFOHEADER)) == 0){return NOERROR;}return E_INVALIDARG;} // CheckTransform
//
// DecideBufferSize
//
// Tell the output pin's allocator what size buffers we
// require. Can only do this when the input is connected
//
HRESULT CAppTransform::DecideBufferSize(IMemAllocator *pAlloc,ALLOCATOR_PROPERTIES *pProperties)
{CheckPointer(pAlloc,E_POINTER);CheckPointer(pProperties,E_POINTER);// Is the input pin connectedif(m_pInput->IsConnected() == FALSE){return E_UNEXPECTED;}HRESULT hr = NOERROR;pProperties->cBuffers = 1;pProperties->cbBuffer = m_pInput->CurrentMediaType().GetSampleSize();ASSERT(pProperties->cbBuffer);// If we don't have fixed sized samples we must guess some sizeif(!m_pInput->CurrentMediaType().bFixedSizeSamples){if(pProperties->cbBuffer < 100000){// nothing more than a guess!!pProperties->cbBuffer = 100000;}}// Ask the allocator to reserve us some sample memory, NOTE the function// can succeed (that is return NOERROR) but still not have allocated the// memory that we requested, so we must check we got whatever we wantedALLOCATOR_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;} // DecideBufferSize
//
// GetMediaType
//
// I support one type, namely the type of the input pin
// We must be connected to support the single output type
//
HRESULT CAppTransform::GetMediaType(int iPosition, CMediaType *pMediaType)
{// Is the input pin connectedif(m_pInput->IsConnected() == FALSE){return E_UNEXPECTED;}// This should never happenif(iPosition < 0){return E_INVALIDARG;}// Do we have more items to offerif(iPosition > 0){return VFW_S_NO_MORE_ITEMS;}CheckPointer(pMediaType,E_POINTER);*pMediaType = m_pInput->CurrentMediaType();return NOERROR;}
HRESULT CAppTransform::Copy(IMediaSample *pSource, IMediaSample *pDest) const
{CheckPointer(pSource,E_POINTER);CheckPointer(pDest,E_POINTER);// Copy the sample dataBYTE *pSourceBuffer, *pDestBuffer;long lSourceSize = pSource->GetActualDataLength();#ifdef DEBUGlong lDestSize = pDest->GetSize();ASSERT(lDestSize >= lSourceSize);
#endifpSource->GetPointer(&pSourceBuffer);pDest->GetPointer(&pDestBuffer);CopyMemory((PVOID) pDestBuffer,(PVOID) pSourceBuffer,lSourceSize);// Copy the sample timesREFERENCE_TIME TimeStart, TimeEnd;if(NOERROR == pSource->GetTime(&TimeStart, &TimeEnd)){pDest->SetTime(&TimeStart, &TimeEnd);}LONGLONG MediaStart, MediaEnd;if(pSource->GetMediaTime(&MediaStart,&MediaEnd) == NOERROR){pDest->SetMediaTime(&MediaStart,&MediaEnd);}// Copy the Sync point propertyHRESULT hr = pSource->IsSyncPoint();if(hr == S_OK){pDest->SetSyncPoint(TRUE);}else if(hr == S_FALSE){pDest->SetSyncPoint(FALSE);}else{  // an unexpected error has occured...return E_UNEXPECTED;}// Copy the media typeAM_MEDIA_TYPE *pMediaType;pSource->GetMediaType(&pMediaType);pDest->SetMediaType(pMediaType);DeleteMediaType(pMediaType);// Copy the preroll propertyhr = pSource->IsPreroll();if(hr == S_OK){pDest->SetPreroll(TRUE);}else if(hr == S_FALSE){pDest->SetPreroll(FALSE);}else{  // an unexpected error has occured...return E_UNEXPECTED;}// Copy the discontinuity propertyhr = pSource->IsDiscontinuity();if(hr == S_OK){pDest->SetDiscontinuity(TRUE);}else if(hr == S_FALSE){pDest->SetDiscontinuity(FALSE);}else{  // an unexpected error has occured...return E_UNEXPECTED;}// Copy the actual data lengthlong lDataLength = pSource->GetActualDataLength();pDest->SetActualDataLength(lDataLength);return NOERROR;} // Copy
//
// Transform
//
// Copy the input sample into the output sample
// Then transform the output sample 'in place'
//
HRESULT CAppTransform::Transform(IMediaSample *pIn, IMediaSample *pOut)
{HRESULT hr = Copy(pIn, pOut);if (FAILED(hr)) {return hr;}return Transform(pOut);} // Transform
HRESULT CAppTransform::Transform(IMediaSample *pSample)
{// Override to do something inside the application// Such as grabbing a poster frame...// ...BYTE *pData;                // Pointer to the actual image bufferlong lDataLen;              // Holds length of any given sampleint iPixel;                 // Used to loop through the image pixelstagRGBTRIPLE *prgb;            // Holds a pointer to the current pixelAM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;ASSERT(pvi);CheckPointer(pSample,E_POINTER);pSample->GetPointer(&pData);lDataLen = pSample->GetSize();// Get the image properties from the BITMAPINFOHEADERint cxImage    = pvi->bmiHeader.biWidth;int cyImage    = pvi->bmiHeader.biHeight;int numPixels  = cxImage * cyImage;// int iPixelSize = pvi->bmiHeader.biBitCount / 8;// int cbImage    = cyImage * cxImage * iPixelSize;prgb = (tagRGBTRIPLE*) pData;for (iPixel=0; iPixel < numPixels; iPixel++, prgb++) {prgb->rgbtRed=prgb->rgbtBlue=prgb->rgbtGreen=(prgb->rgbtRed+prgb->rgbtBlue+prgb->rgbtGreen)/3;}return S_OK;
}// Check if we can support this specific proposed type and format
HRESULT CAppTransform::CheckInputType(const CMediaType *pmt)
{// We accept a series of raw media types/*if (pmt->majortype == MEDIATYPE_Video &&(pmt->subtype == MEDIASUBTYPE_RGB32 ||pmt->subtype == MEDIASUBTYPE_RGB24 ||pmt->subtype == MEDIASUBTYPE_RGB565 ||pmt->subtype == MEDIASUBTYPE_RGB555 ||pmt->subtype == MEDIASUBTYPE_UYVY ||pmt->subtype == MEDIASUBTYPE_YUY2)||pmt->subtype==MEDIASUBTYPE_NV12)*/if (pmt->majortype == MEDIATYPE_Video &&(pmt->subtype == MEDIASUBTYPE_RGB24)){return NOERROR;}return E_FAIL;
}// --- graph building (examples) ---------
CAppGraphBuilder::CAppGraphBuilder() :
m_pBuild(NULL),
m_pGraph(NULL),
m_pFilter(NULL),
m_dwObjectTable(0)
{CoInitialize(NULL);
}CAppGraphBuilder::~CAppGraphBuilder()
{DestroyGraph();CoUninitialize();
}void CAppGraphBuilder::DestroyGraph(void)
{if (m_pGraph) {RemoveFromObjectTable();// ensure graph window is not child of oursIVideoWindow* pVW = NULL;HRESULT hr = m_pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVW);if (SUCCEEDED(hr)) {pVW->put_Visible(OAFALSE);pVW->put_Owner(NULL);pVW->put_MessageDrain(NULL);pVW->Release();}m_pGraph->Release();m_pGraph = NULL;m_pBuild->Release();m_pBuild = NULL;}if (m_pFilter) {m_pFilter->Release();m_pFilter = NULL;}
}
HRESULT CAppGraphBuilder::InitCaptureGraphBuilder(IGraphBuilder **ppGraph,  // Receives the pointer.ICaptureGraphBuilder2 **ppBuild  // Receives the pointer.)
{if (!ppGraph || !ppBuild){return E_POINTER;}IGraphBuilder *pGraph = NULL;ICaptureGraphBuilder2 *pBuild = NULL;// Create the Capture Graph Builder.HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );if (SUCCEEDED(hr)){// Create the Filter Graph Manager.hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void**)&pGraph);if (SUCCEEDED(hr)){// Initialize the Capture Graph Builder.pBuild->SetFiltergraph(pGraph);// Return both interface pointers to the caller.*ppBuild = pBuild;*ppGraph = pGraph; // The caller must release both interfaces.return S_OK;}else{pBuild->Release();}}return hr; // Failed
}HRESULT CAppGraphBuilder::EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{ICreateDevEnum *pDevEnum = NULL;// Create the System Device Enumerator.HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum));if (SUCCEEDED(hr)){// Create an enumerator for the video capture category.hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,ppEnum, 0);}return hr;
}
void CAppGraphBuilder::DisplayDeviceInformation(IEnumMoniker *pEnum, IMoniker** pMoniker)
{HWND hList; // Handle to the list box.while (pEnum->Next(1, pMoniker, NULL) == S_OK){IPropertyBag *pPropBag;HRESULT hr = (*pMoniker)->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));if (FAILED(hr)){(*pMoniker)->Release();continue;  // Skip this one, maybe the next one will work.} // Find the description or friendly name.VARIANT varName;VariantInit(&varName);hr = pPropBag->Read(L"Description", &varName, 0);if (FAILED(hr)){hr = pPropBag->Read(L"FriendlyName", &varName, 0);}if (SUCCEEDED(hr)){// Add it to the application's list box.USES_CONVERSION;/*(long)SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)OLE2T(varName.bstrVal));*/VariantClear(&varName); }pPropBag->Release();(*pMoniker)->Release();}}
HRESULT CAppGraphBuilder::AddFilterByCLSID(IGraphBuilder *pGraph,  // Pointer to the Filter Graph Manager.const GUID& clsid,      // CLSID of the filter to create.LPCWSTR wszName,        // A name for the filter.IBaseFilter **ppF)      // Receives a pointer to the filter.
{if (!pGraph || ! ppF) return E_POINTER;*ppF = 0;IBaseFilter *pF = 0;HRESULT hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER,IID_IBaseFilter, reinterpret_cast<void**>(&pF));if (SUCCEEDED(hr)){hr = pGraph->AddFilter(pF, wszName);if (SUCCEEDED(hr))*ppF = pF;elsepF->Release();}return hr;
}
HRESULT CAppGraphBuilder::BuildFromFile(LPCWSTR pszFile)
{DestroyGraph();IMoniker* pMoniker;IMediaEvent   *pEvent;InitCaptureGraphBuilder(&m_pGraph,&m_pBuild);HRESULT hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);AddToObjectTable();IBaseFilter *pCap; // Video capture filter.IEnumMoniker *pEnum;hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);DisplayDeviceInformation(pEnum, &pMoniker);hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);if (SUCCEEDED(hr)){hr = m_pGraph->AddFilter(pCap, L"Capture Filter");}hr = m_pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);IBaseFilter *pMux;hr = m_pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,L"D:\\Example.avi",&pMux,NULL);hr = m_pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pCap,NULL,pMux);// Try to find the video renderer, by looking for IVideoWindowIBaseFilter* pVR;hr = FindFilterByInterface(IID_IVideoWindow, &pVR);if (FAILED(hr)) {return hr;}// Find the media type on the input pin of the Video Renderer// to check for overlay connection where no actual data is passedIPin* pPin = InputPinOf(pVR);AM_MEDIA_TYPE mt;pPin->ConnectionMediaType(&mt);pPin->Release();CMediaType mtIn = mt;FreeMediaType(mt);if (mtIn.subtype == MEDIASUBTYPE_Overlay) {// This connection may be a overlay mixer // need to move upstream one placeIBaseFilter* pOvMix = NULL;hr = NextUpstream(pVR, &pOvMix);pVR->Release();if (FAILED(hr)) {return hr;}pVR = pOvMix;}// Create the transform and insert in graphCreateAppFilter();// Add Color Space ConvertIBaseFilter *pColor;hr=AddFilterByCLSID(m_pGraph, CLSID_Colour, L"Color Space Converter", &pColor);// Try to insert our transform filterhr = ConnectUpstreamOf(pVR, pColor,m_pFilter);//pVR->Release();//pColor->Release();return hr;
}// Start the graph
HRESULT CAppGraphBuilder::Run(void)
{IMediaControl* pControl = NULL;HRESULT hr = m_pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);if (SUCCEEDED(hr)) {hr = pControl->Run();pControl->Release();}return hr;
}// Make the video window a child of this app
HRESULT CAppGraphBuilder::MakeChild(HWND hwnd)
{if (!m_pGraph) {return E_FAIL;}IVideoWindow* pVW = NULL;HRESULT hr = m_pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVW);if (SUCCEEDED(hr)) {HWND hwndOld;pVW->get_Owner((LONG*)&hwndOld);if (hwndOld != hwnd){pVW->put_AutoShow(OAFALSE);pVW->put_Visible(OAFALSE);long    WindowStyle = 0;// Tweak the video's window style to get rid of the caption and frame:hr = pVW->get_WindowStyle(&WindowStyle);if (SUCCEEDED(hr)) {WindowStyle &= ~WS_OVERLAPPEDWINDOW; // No frame junkWindowStyle |= WS_CHILD;             // Needs to be childhr = pVW->put_WindowStyle(WindowStyle);}pVW->put_Owner((LONG)hwnd);pVW->put_MessageDrain((LONG)hwnd);if (hwnd != NULL) {RECT rc;GetClientRect(hwnd, &rc);pVW->SetWindowPosition(rc.left,rc.top,rc.right - rc.left,rc.bottom - rc.top);pVW->put_Visible(OATRUE);}}pVW->Release();}return hr;
}// Resize the video window
HRESULT CAppGraphBuilder::ResizeVideoWindow(RECT* prc)
{if (!m_pGraph) {return E_FAIL;}IVideoWindow* pVW = NULL;HRESULT hr = m_pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVW);if (SUCCEEDED(hr)) {hr = pVW->SetWindowPosition(prc->left,prc->top,prc->right - prc->left,prc->bottom - prc->top);pVW->Release();}return hr;
}// Create the app-based filter and insert into graph (unconnected)
void CAppGraphBuilder::CreateAppFilter(void)
{if (m_pFilter) {m_pFilter->Release();m_pFilter = NULL;}HRESULT hr = S_OK;m_pFilter = new CAppTransform(NULL, &hr);// Make the initial refcount 1 to match COM creation!!!m_pFilter->AddRef();// Add to graph -- nb need to Query properly for the// right interface before giving that to the graph objectIBaseFilter* pFilter = NULL;hr = m_pFilter->QueryInterface(IID_IBaseFilter, (void**)&pFilter);if (SUCCEEDED(hr)) {hr = m_pGraph->AddFilter(pFilter, L"App Transform");pFilter->Release();}
}// Locate a filter within the graph by searching (from renderers upstream)
// looking for a specific interface on the filter
HRESULT CAppGraphBuilder::FindFilterByInterface(REFIID riid, IBaseFilter** ppFilter)
{*ppFilter = NULL;IEnumFilters* pEnum;HRESULT hr = m_pGraph->EnumFilters(&pEnum);if (FAILED(hr)) {return hr;}IBaseFilter* pFilter = NULL;while (pEnum->Next(1, &pFilter, NULL) == S_OK) {// Check for required interfaceIUnknown* pUnk;HRESULT hrQuery = pFilter->QueryInterface(riid, (void**)&pUnk);if (SUCCEEDED(hrQuery)) {pUnk->Release();pEnum->Release();*ppFilter = pFilter;return S_OK;}pFilter->Release();}pEnum->Release();return E_FAIL;
}// Connect the filter pTransform upstream of pFilter by reconnecting pins.
// Assumes that pTransform has only one input and one output, and
// that pFilter has only one input.
HRESULT CAppGraphBuilder::ConnectUpstreamOf(IBaseFilter* pFilter, IBaseFilter*pColor,IBaseFilter* pTransform)
{IPin* pPinIn = InputPinOf(pFilter);if (!pPinIn) {return E_FAIL;}// Get the peer output pinIPin* pPinOut = NULL;HRESULT hr = pPinIn->ConnectedTo(&pPinOut);if (FAILED(hr)) {pPinIn->Release();return hr;}// Disconnect the current connectionhr = m_pGraph->Disconnect(pPinOut);if (SUCCEEDED(hr)) {hr = m_pGraph->Disconnect(pPinIn);}// Insert pTransform filter by connecting its input pin and output pinif (SUCCEEDED(hr)) {IPin* pPinInCor = InputPinOf(pColor);hr = m_pGraph->Connect(pPinOut, pPinInCor);pPinInCor->Release();}if (SUCCEEDED(hr)) {IPin* pPinInXfm = InputPinOf(pTransform);IPin* pPinOutCor = OutputPinOf(pColor);hr = m_pGraph->Connect(pPinOutCor, pPinInXfm);pPinInXfm->Release();pPinOutCor->Release();}if (SUCCEEDED(hr)) {IPin* pPinOutXfm = OutputPinOf(pTransform);hr = m_pGraph->Connect(pPinOutXfm, pPinIn);pPinOutXfm->Release();}pPinIn->Release();pPinOut->Release();return hr;
}// Find the first pin of a specific direction on a given filter
IPin* CAppGraphBuilder::GetPin(IBaseFilter* pFilter, PIN_DIRECTION dirRequest)
{IPin * foundPin = NULL;IEnumPins* pEnum = NULL;HRESULT hr = pFilter->EnumPins(&pEnum);if (SUCCEEDED(hr)) {IPin* pPin = NULL;while (!foundPin && pEnum->Next(1, &pPin, 0) == S_OK) {PIN_DIRECTION dir;pPin->QueryDirection(&dir);if (dir == dirRequest) {foundPin = pPin;}else{pPin->Release();}}pEnum->Release();}return foundPin;
}// Follow the pin connections to return the filter that is
// connected to the first input pin of pFilter
HRESULT CAppGraphBuilder::NextUpstream(IBaseFilter* pFilter, IBaseFilter** ppNext)
{IPin* pPin = InputPinOf(pFilter);if (!pPin) {return E_FAIL;}// Get the peer output pinIPin* pPinOut = NULL;HRESULT hr = pPin->ConnectedTo(&pPinOut);pPin->Release();if (FAILED(hr)) {return hr;}PIN_INFO info;pPinOut->QueryPinInfo(&info);pPinOut->Release();*ppNext = info.pFilter;return S_OK;
}For GraphEdit Dubug purpose /
void CAppGraphBuilder::AddToObjectTable(void)
{IMoniker * pMoniker = 0;IRunningObjectTable * objectTable = 0;if (SUCCEEDED(GetRunningObjectTable(0, &objectTable))) {WCHAR wsz[256];wsprintfW(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)m_pGraph, GetCurrentProcessId());HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);if (SUCCEEDED(hr)) {hr = objectTable->Register(0, m_pGraph, pMoniker, &m_dwObjectTable);pMoniker->Release();}objectTable->Release();}
}void CAppGraphBuilder::RemoveFromObjectTable(void)
{IRunningObjectTable * objectTable = 0;if (SUCCEEDED(GetRunningObjectTable(0, &objectTable))) {objectTable->Revoke(m_dwObjectTable);objectTable->Release();m_dwObjectTable = 0;}
}

调用:

 LPCWSTR wchFile=L"D:\\example.avi";m_Graph.BuildFromFile(wchFile);m_Graph.MakeChild(GetSafeHwnd());m_Graph.Run();

最后记得

pControl->Stop();

视频捕获增加color space converter + Transform Filter相关推荐

  1. Unity Gamma Linear Color Space

    转载文章,出自http://www.manew.com/thread-105872-1-1.html,作者 alphatt Gamma & Linear Color Space 一.真实?感觉 ...

  2. Gamma Linear Color Space

    http://www.manew.com/forum.php?mod=viewthread&tid=105872 一.真实?感觉?    1.你相信你的眼睛吗 (蓝黑or白金?) (A和B的颜 ...

  3. 视频捕获软件开发完全教学

    前 言 视频捕获是指由专用的视频采集卡捕获声频和视频信息,然后将其进行数据化处理,再经过软件的压缩进行处理,这时就可对这些数据进行保存.回放.传输等各种操作. Windows专门提供了Video fo ...

  4. 空间素材代码_C++大神解读视频捕获程序,VC++基于Directx开发的源代码

    一款小巧的视频捕获程序,VC++6.0基于Directx开发的源代码,编译时需要Directx相关类库文件, 窗口表单编写的简单视频捕捉应用程序.这个工程既演示了窗口表单应用程序的创建,又演示了 Op ...

  5. Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗?

    "为什么我渲染出来的场景,总是感觉和真实世界不像呢?" 游戏从业者或多或少都听过Linear.Gamma.sRGB和伽马校正这些术语,互联网上也有很多科普的资料,但是它们似乎又都没 ...

  6. 火车头过滤 css样式_HTML5和CSS3过滤器中的网络摄像头视频捕获

    火车头过滤 css样式 Webcam Video Capture in HTML5 and CSS3 filters As we know – HTML5 defines a new element ...

  7. 彩色空间(Color Space)

    背景 学习openCV-Python Tutorial,在Image Processing in OpenCV这一节里有提到彩色空间的转换,结合其他的一些资料对彩色空间(Color Space),彩色 ...

  8. java.lang.IllegalArgumentException: Numbers of source Raster bands and source color space components

    项目在文件压缩的时候报错如下: Exception in thread "main" java.lang.IllegalArgumentException: Numbers of ...

  9. VC++ VFW 视频捕获

    目 录 一. 视频捕获快速入门 二.基本的捕获设置 1.设置捕获速度: 2.设置终止捕获 3.捕获的时间限制 三.关于捕获窗口 1.创建一个AVICAP捕获窗口 2.将一个捕获窗口连接至捕获设备 3. ...

  10. Squish 7.0中视频捕获 (含相关网络直播研讨会报名信息)

    本文翻译自Video capture in Squish 7.0 – feature focus (原文发布于2022年3月4日) 原文作者:Qt公司软件工程师Katarina Behrens 翻译: ...

最新文章

  1. CVPR2019论文看点:自学习Anchor原理
  2. Java IDEA import sun.reflect.ConstructorAccessor报错
  3. Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了
  4. linux命令之nc,emacs,go run,查看文件行数等
  5. Oracle左右全连接总结
  6. 通过声明Attribute属性改变不同类的输出效果
  7. Leetcode--494. 目标和
  8. httos双向认证配置_idou老师教你学Istio 15:Istio实现双向TLS的迁移
  9. swarm部署mysql_「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)...
  10. 分享一个HandsFree Robot的国内机器人开源平台
  11. 量化投资学习——一份高频因子的研报综述
  12. 人工智能顶级会议与国际期刊总结
  13. 投影仪买哪个好?家用投影仪哪种好
  14. 智能客服机器人的场景应用及功能有哪些
  15. 再招一万人,太猛了。。。
  16. 2015自然基金一审结果:项目申请的共性问题。
  17. Hololens单击、双击
  18. SVN服务端和客户端搭建教程
  19. C++ L1-034. 点赞
  20. 【Linux】~ 如何将本地文件(windows)复制(传输)到虚拟机中

热门文章

  1. 访问samba文件 指定网络名不再可用
  2. 后院失火的大疆,距离真正的巨头还有多远?
  3. AcWing 2005. 马蹄铁题解
  4. 第62篇:批量去除EXCEL文件密码
  5. 易语言制作计算软件简单步骤_情侣头像制作 一款简单又好玩的头像制作软件...
  6. export_savedmodel
  7. HTML Report报告无法正常展示的解决办法
  8. 解决outlook2016 中邮件中,点击链接提示(您的组织策略阻止我们为您完成此操作)解决方案
  9. 如何批量调整图片大小?
  10. Mac 安装非信任开发者软件