#include "CaptureAudio.h"
CaptureAudio::CaptureAudio()
{
//COM Library Initialize
if (FAILED(CoInitialize(NULL)))
{
Msg(m_App,TEXT("CoInitialize Failed!\r\n"));
return;
}
//initialize member variable
m_nCaptureDeviceNumber = 0;
m_pDevFilter = NULL;
m_pCaptureGB = NULL;
m_pGraphBuilder = NULL;
m_pMediaContrl = NULL;
m_App = NULL;
InitializeEnv();
}
CaptureAudio::~CaptureAudio()
{
CloseInterface();
CoUninitialize();
}
HRESULT CaptureAudio::EnumAllDevices(HWND hCombox)
{
if (!hCombox)
return S_FALSE;
ICreateDevEnum *pDevEnum;
IEnumMoniker *pEnumMon;
IMoniker *pMoniker;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum,(LPVOID*)&pDevEnum);
if (SUCCEEDED(hr))
{
// get all Audio input Device Friendly Name
hr = pDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory,&pEnumMon, 0);
if (hr == S_FALSE)
{
hr = VFW_E_NOT_FOUND;
return hr;
}
pEnumMon->Reset();
ULONG cFetched;
while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)
{
IPropertyBag *pProBag;
hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);
if (SUCCEEDED(hr))
{
VARIANT varTemp;
varTemp.vt = VT_BSTR;
hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);
if (SUCCEEDED(hr))
{
//int nStrSize = WideCharToMultiByte(CP_ACP,0,varTemp.bstrVal,-1,0,0,NULL,FALSE);
//char *strName = new char[nStrSize];
//WideCharToMultiByte(CP_ACP,0,varTemp.bstrVal,-1,strName,nStrSize,NULL,FALSE);
//m_vecCapDeviceName.push_back(string(strName)); //push the device name to vector
StringCchCopy(m_pCapDeviceName[m_nCaptureDeviceNumber],MAX_PATH,varTemp.bstrVal);
m_nCaptureDeviceNumber++; //Device number add 1
::SendMessage(hCombox, CB_ADDSTRING, 0,(LPARAM)varTemp.bstrVal);
SysFreeString(varTemp.bstrVal);
}
pProBag->Release();
}
pMoniker->Release();
}
pEnumMon->Release();
//get All Audio Renderer Device Friendly Name
hr = pDevEnum->CreateClassEnumerator(CLSID_AudioRendererCategory,&pEnumMon, 0);
if (hr == S_FALSE)
{
hr = VFW_E_NOT_FOUND;
return hr;
}
pEnumMon->Reset();
int index = 0;
while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)
{
IPropertyBag *pProBag;
hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);
if (SUCCEEDED(hr))
{
VARIANT varTemp;
varTemp.vt = VT_BSTR;
hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);
if (SUCCEEDED(hr))
{
StringCchCopy(m_pRendererDeviceName[index],MAX_PATH,varTemp.bstrVal);
index++; //Device number add 1
SysFreeString(varTemp.bstrVal);
}
pProBag->Release();
}
pMoniker->Release();
}
pEnumMon->Release();
}
return hr;
}
HRESULT CaptureAudio::InitializeEnv()
{
HRESULT hr;
//Create the filter graph
hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,(LPVOID*)&m_pGraphBuilder);
if(FAILED(hr))
return hr;
//Create the capture graph builder
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,(LPVOID*)&m_pCaptureGB);
if(FAILED(hr))
return hr;
hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&m_pMediaContrl);
if(FAILED(hr))
return hr;
m_pCaptureGB->SetFiltergraph(m_pGraphBuilder);
if(FAILED(hr))
return hr;
return hr;
}
void CaptureAudio::CloseInterface()
{
if (m_pMediaContrl)
m_pMediaContrl->Stop();
//release interface
ReleaseInterface(m_pDevFilter);
ReleaseInterface(m_pCaptureGB);
ReleaseInterface(m_pGraphBuilder);
ReleaseInterface(m_pMediaContrl);
}
HRESULT CaptureAudio::OpenDevice(BSTR bstrDeviceName)
{
HRESULT hr;
IBaseFilter *pWaveDest = NULL, *pWriter = NULL, *pOutputDev = NULL;
IFileSinkFilter *pSink= NULL;
BSTR bstrTempDeviceName;
BSTR bstrOutPin,bstrInPin;
IBaseFilter *pPinTeeFilter = NULL;
hr = BindDeviceFilter(bstrDeviceName,CLSID_AudioInputDeviceCategory, &m_pDevFilter);
if (FAILED(hr))
return hr;
// Add the audio capture filter to the filter graph.
hr = m_pGraphBuilder->AddFilter(m_pDevFilter, L"Capture");
if (FAILED(hr))
return hr;
/************************************************************************/
/* Audio Prieview */
/************************************************************************/
bstrTempDeviceName = SysAllocString(L"Infinite Pin Tee Filter");
hr = BindDeviceFilter(bstrTempDeviceName,CLSID_LegacyAmFilterCategory,&pPinTeeFilter);
if (FAILED(hr))
return hr;
hr = m_pGraphBuilder->AddFilter(pPinTeeFilter,bstrTempDeviceName);
bstrInPin = SysAllocString(L"Capture");
bstrOutPin = SysAllocString(L"Input");
hr = DeviceConnect(m_pDevFilter,pPinTeeFilter,bstrInPin,bstrOutPin);
if(FAILED(hr))
return hr;
//////////////////////////////////////////////////////////////////////////
// output the Rendered Device
SysReAllocString(&bstrTempDeviceName,m_pRendererDeviceName[0]); //Rendered Device Name;
hr = BindDeviceFilter(bstrTempDeviceName,CLSID_AudioRendererCategory,&pOutputDev);
if(FAILED(hr))
return hr;
hr = m_pGraphBuilder->AddFilter(pOutputDev,bstrTempDeviceName);
if(FAILED(hr))
return hr;
SysReAllocString(&bstrInPin,L"Output1");
SysReAllocString(&bstrOutPin,L"Audio Input pin (rendered)");
hr = DeviceConnect(pPinTeeFilter,pOutputDev,bstrInPin,bstrOutPin);
if(FAILED(hr))
return hr;
//////////////////////////////////////////////////////////////////////////
//Add AudioRecorder WAV Dest
SysReAllocString(&bstrTempDeviceName,TEXT("AudioRecorder WAV Dest"));
hr = BindDeviceFilter(bstrTempDeviceName,CLSID_LegacyAmFilterCategory, &pWaveDest);
if (FAILED(hr))
return hr;
hr = m_pGraphBuilder->AddFilter(pWaveDest,bstrTempDeviceName);
if (FAILED(hr))
return hr;
//Connect the AudioRecorder WAV Dest
SysReAllocString(&bstrInPin,L"Output2");
SysReAllocString(&bstrOutPin,L"In");
hr = DeviceConnect(pPinTeeFilter,pWaveDest,bstrInPin,bstrOutPin);
if (FAILED(hr))
return hr;
// output Filter Wirter
SysReAllocString(&bstrTempDeviceName,L"File writer");
hr = BindDeviceFilter(bstrTempDeviceName,CLSID_LegacyAmFilterCategory,&pWriter);
if (FAILED(hr))
return hr;
IFileSinkFilter *pFileSink= NULL;
SysReAllocString(&bstrTempDeviceName,L"test.wav");
hr = pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pFileSink);
if(FAILED(hr))
return hr;
hr = pFileSink->SetFileName((LPCOLESTR)bstrTempDeviceName,NULL);
if(FAILED(hr))
return hr;
hr = m_pGraphBuilder->AddFilter(pWriter,bstrTempDeviceName);
if(FAILED(hr))
return hr;
SysReAllocString(&bstrInPin,L"Out");
SysReAllocString(&bstrOutPin,L"in");
hr = DeviceConnect(pWaveDest,pWriter,bstrInPin,bstrOutPin);
if(FAILED(hr))
return hr;
SysFreeString(bstrInPin);
SysFreeString(bstrOutPin);
SysFreeString(bstrTempDeviceName);
hr = m_pMediaContrl->Run();
if(FAILED(hr))
return hr;
return hr;
}
HRESULT CaptureAudio::DeviceConnect(IBaseFilter* pInputDevice,IBaseFilter* pOutputDevice, BSTR bstrInputPin, BSTR bstrOutputDevice)
{
HRESULT hr;
IEnumPins *pInputPins = NULL, *pOutputPins = NULL;
IPin *pIn = NULL, *pOut = NULL;
hr = pInputDevice->EnumPins(&pInputPins);
if (SUCCEEDED(hr))
{
hr = pInputDevice->FindPin(bstrInputPin,&pIn);
if(FAILED(hr))
return hr;
}else
return hr;
hr = pOutputDevice->EnumPins(&pOutputPins);
if (SUCCEEDED(hr))
{
hr = pOutputDevice->FindPin(bstrOutputDevice,&pOut);
if(FAILED(hr))
return hr;
}
hr = pIn->Connect(pOut, NULL);
if (FAILED(hr))
return hr;
return hr;
}
HRESULT CaptureAudio::BindDeviceFilter(BSTR deviceName,GUID DEVICE_CLSID,IBaseFilter **pBaseFilter)
{
ICreateDevEnum *pDevEnum;
IEnumMoniker *pEnumMon;
IMoniker *pMonike
没有合适的资源?快使用搜索试试~ 我知道了~
DirectShow获取视频和音频数据
共46个文件
tlog:14个
h:6个
cpp:5个
5星 · 超过95%的资源 需积分: 44 896 下载量 84 浏览量
2013-03-23
09:46:02
上传
评论 14
收藏 674KB RAR 举报
温馨提示
DirectShow获取视频和音频数据,对视频的易歌预览和截图,对音频的预览和保存到文件
资源推荐
资源详情
资源评论
收起资源包目录
CaptureVideoAndAudio.rar (46个子文件)
CaptionVideo.vcxproj.user 143B
CaptureVideo.h 1KB
Audio.GRF 6KB
common.h 510B
CaptionVideo.sln 890B
qedit.h 3KB
Capture.ico 75KB
common.cpp 1KB
resource.h 1KB
CaptionVideo.vcxproj 4KB
SampleGrabberCallback.cpp 3KB
CaptureAudio.h 1004B
CaptionVideo.vcxproj.filters 2KB
Debug
vc100.idb 635KB
CL.write.1.tlog 3KB
CL.read.1.tlog 74KB
mt.read.1.tlog 788B
rc.write.1.tlog 270B
rc.read.1.tlog 2KB
CaptionVideo.log 2KB
CaptionVideo.res 248B
mt.command.1.tlog 514B
cl.command.1.tlog 3KB
link-cvtres.read.1.tlog 2B
CaputrueAudio.obj 63KB
link.write.1.tlog 1KB
link-cvtres.write.1.tlog 2B
link.command.1.tlog 2KB
CaptionVideo.exe 82KB
rc.command.1.tlog 568B
link.read.1.tlog 4KB
common.obj 44KB
mt.write.1.tlog 328B
CaptionVideo.ilk 669KB
Main.obj 53KB
CaptionVideo.lastbuildstate 85B
CaptionVideo.exe.intermediate.manifest 381B
CaptureVideo.obj 64KB
CaptionVideo.pdb 939KB
SampleGrabberCallback.obj 59KB
vc100.pdb 364KB
Main.cpp 8KB
CaputrueAudio.cpp 9KB
SampleGrabberCallback.h 895B
CaptionVideo.rc 4KB
CaptureVideo.cpp 9KB
共 46 条
- 1
iot-genius
- 粉丝: 647
- 资源: 51
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页