16,472
社区成员
发帖
与我相关
我的任务
分享
/* 设置视频捕获设备过滤器 */
HRESULT CollectionController::setVideoDevice()
{
HRESULT hr = S_OK;
do
{
/* 创建系统设备枚举器 */
ICreateDevEnum * pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void * *)&pCreateDevEnum);
if(FAILED(hr)) break;
/* 创建视频采集设备枚举器 */
IEnumMoniker * pEnumMoniker;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);
if(FAILED(hr)) break;
ULONG ulFetched = 0;
IMoniker * pMoniker = NULL;
if(pEnumMoniker->Next(1, &pMoniker, &ulFetched) == S_OK)
{
/* 得到视频捕获设备 */
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void * *)&m_pVideoCapture);
if(FAILED(hr)) break;
pMoniker->Release();
}
pEnumMoniker->Release();
pCreateDevEnum->Release();
/* 把设备添加到过滤器通道中 */
hr = m_pFilterGraph->AddFilter(m_pVideoCapture, L"Video Capture Filter");
if(FAILED(hr)) break;
}while(FALSE);
return hr;
}
/* 设置音频捕获设备过滤器 */
HRESULT CollectionController::setAudioDevice()
{
/* 标记返回值 */
HRESULT hr = S_OK;
do
{
/* 创建系统设备枚举器 */
CComPtr<ICreateDevEnum> pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void * *)&pCreateDevEnum);
if(FAILED(hr)) break;
/* 创建音频采集设备枚举器 */
CComPtr<IEnumMoniker> pEnumMoniker;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnumMoniker, 0);
if(FAILED(hr)) break;
ULONG ulFetched = 0;
IMoniker * pMoniker = NULL;
if(pEnumMoniker->Next(1, &pMoniker, &ulFetched) == S_OK)
{
/* 得到音频捕获设备 */
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void * *)&m_pAudioCapture);
if(FAILED(hr)) break;
pMoniker->Release();
}
pEnumMoniker.Release();
pCreateDevEnum.Release();
/* 把设备添加到过滤器通道中 */
hr = m_pFilterGraph->AddFilter(m_pAudioCapture, L"Audio Capture Filter");
if(FAILED(hr)) break;
}while(FALSE);
return hr;
}
/* 采集,预览并且保存为文件 */
HRESULT CollectionController::start(HWND hWnd)
{
HRESULT hr = S_OK;
do
{
/* 设置音频捕获设备过滤器 */
hr = setAudioDevice();
if(FAILED(hr)) break;
/* 设置视频捕获设备过滤器 */
hr = setVideoDevice();
if(FAILED(hr)) break;
/* 将filter加入到graph中 */
hr = addFilter();
if(FAILED(hr)) break;
/* 预览 */
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, m_pAudioCapture, NULL, NULL);
if(FAILED(hr)) break;
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pVideoCapture, NULL, NULL);
if(FAILED(hr)) break;
/* 设置窗口 */
hr = setDisplayWnd(hWnd);
if(FAILED(hr)) break;
/*
写到文件
*/
IBaseFilter * pWriter;
hr = m_pCaptureGB->SetOutputFileName(&MEDIASUBTYPE_Asf, L"e:\\1.asf", &pWriter, NULL);
if(FAILED(hr)) break;
/* 对pWriter(AsfWriter)进行设置 */
IConfigAsfWriter *pConfig = 0;
hr = pWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);
if(SUCCEEDED(hr))
{
pConfig->Release();
}
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio, m_pAudioCapture, NULL, pWriter);
if(FAILED(hr)) break;
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pVideoCapture, NULL, pWriter);
if(FAILED(hr)) break;
/* 开始采集 */
hr = m_pMediaControl->Run();
if(FAILED(hr)) break;
}while(FALSE);
return hr;
}