HRESULT InitCaptureGraphBuilder(IGraphBuilder **ppGraph, //Receives the pointer
ICaptureGraphBuilder2 **ppBuilder) //Receives the pointer
{
if(!ppGraph || !ppBuilder)
{
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**)&pGraph);
if(SECCEEDED(hr))
{
//Create the Filter Graph Manager
hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGraph);
if(SECCEEDED(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 interface
return S_OK;
}
else
{
pBuild->Release();
}
}
return hr; //Failed
}
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
//Create the system device enumerator
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCT_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast<void**>(&pDevEnum));
if(SUCCEEDED(hr))
{
//创建一个枚举器,枚举视频设备
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEnum, 0);
}
HWND hList; //Handle to the list box
IMoniker *pMoniker = NULL;
while(pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));
if(FAILED(hr))
{
pMoniker->Release();
continue; //Skip this one, maybe the next one will work
}
VARIANT varName;
hr = pPropBag->Read(L"Description", &varName, 0);
if(FAILED(hr))
{
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
}
if(SECCEEDED(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();
}
IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if(SECCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
ICaptureGraphBuilder2 *pBuild; //Capture Graph Builder
//Initialize pBuild(not shown)
...
IBaseFilter *pCap; //Video capture filter
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pCap, NULL, NULL);
}
IBaseFilter *pMux;
hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi, //Specifies AVI for the target file
L"C:\\Example.avi", //File name
&pMux, //Receives a pointer to the mux
NULL); //(Optional)Receives a pointer to the file sink
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, //Pin category
&MEDIATYPE_Video, //Media type
pCap, //Capture filter
NULL, //Intermediate filter(optional)
pMux); //Mux or file sink filter
//Release the mux filter
pMux->Release();
IConfigAviMux *pConfigMux = NULL;
hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);
if(SUCCEEDED(hr))
{
pConfigMux->SetMasterStream(1);
pConfigMux->Release();
}
IBaseFilter *pEncoder;
//Add it to the filter graph
pGraph->AddFilter(pEncoder, L"Encode");
//Render the stream
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
pCap, pEncoder, pMux);
pEncoder->Release();
[b]2 将视频流保存成wmv格式的文件[/b]
IBaseFilter *pASFWriter = 0;
hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Asf, //Create a windows media file
L"C:\\VidCap.wmv", //File name
&pASFWriter, //Receives a pointer to the filter
NULL); //Receives an IFileSinkFilter interface pointer(optional)
IConfigAsfWriter *pConfig = 0;
hr = pASFWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);
if(SUCCEEDED(hr))
{
//Configure the ASF Writer filter
pConfig->Release();
}
然后调用ICaptureGraphBuilder2::RenderStream将capture Filter 和 ASF writer连接起来:
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, //Capture pin
&MEDIATYPE_Video, //Video. Use MEDIATYPE_Audio for audio
pCap, //Pointer to the capture filter
0,
pASFWriter); //Pointer to the sink filter(ASF Filter)
IBaseFilter *pMux = 0;
IFileSinkFilter *pSink = 0;
hr = pBuild->SetOutputFileName(&CLSID_MyCustomMuxFilter, //开发自己的Filter
L"C:\\VidCap.avi", &pMux, &pSink);
IBaseFilter *pMux = 0;
IFileSinkFilter *pSink = 0;
hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,
L"C:\\YourFileName.avi", &pMux, &pSink);
if(SUCCEEDED(hr))
{
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
pCap, NULL, pMux);
if(SUCCEEDED(hr))
{
pControl->Run();
pControl->Stop();
//Change the file name and run the graph again
pSink->SetFileName(L"YourFileName02.avi", 0);
pControl->Run();
}
pMux->Release();
pSink->Release();
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有