directshow采集音视频并存储到本地磁盘
我用directshow分别才从摄像头和麦克风采集音视频存储到本地,并生成wmv格式的文件.可是视频预览没有效果,生成文件也是失败的,请大家帮忙看看。代码贴出来:
HWND hVWindow = m_videoWindow.GetSafeHwnd();
pAudioFilter = NULL;
pBuilder=NULL;
pGraph = NULL;
pMediaControl = NULL;
m_pVW=NULL;
//pCompress = NULL;
pASFWriter = NULL;
HRESULT hr;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
IEnumMoniker *pClassEnum = NULL;
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG cFetched;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release();
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
pBuilder->SetFiltergraph(pGraph);
hr = pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVW);
//枚举音频设备
HRESULT hrAudio;
hrAudio = FindAudioDevice(&pAudioFilter);
if (FAILED(hrAudio))
{
MessageBox("查找音频设备失败");
}
pGraph->AddFilter(pAudioFilter,L"Audio");
pGraph->AddFilter(pSrc,L"Video Capture");
hr = pBuilder->RenderStream( &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pGraph, NULL, NULL );
IConfigAsfWriter *pConfig = 0;
hr = pASFWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);
if (SUCCEEDED(hr))
{
// Configure the ASF Writer filter.
pConfig->Release();
}
pGraph->AddFilter(pASFWriter,L"Asf Writer");
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Asf,L"c:\\a.wmv", &pASFWriter, &pSink);
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video, pSrc, NULL, NULL);
// Now add the video capture to the output file.
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, pSrc, NULL, pASFWriter);
// And do the same for the audio.
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Audio, pAudioFilter, NULL, pASFWriter);
pMediaControl->Run();