首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

DirectShow录不到声音解决办法

2012-03-01 
DirectShow录不到声音这是我自己写的一部分录像代码,录出来有画面,但是没有声音请问是不是缺少了什么步骤?

DirectShow录不到声音
这是我自己写的一部分录像代码,录出来有画面,但是没有声音
请问是不是缺少了什么步骤?
CHECK_RESULT和SAFE_RELEASE是我自己写的宏

C/C++ code
CHECK_RESULT(m_pGBuilder->AddFilter(m_pComprsFilter,L"Compress"));    CHECK_RESULT(m_pGBuilder->AddFilter(m_pAudioFilter,L"Audio"));    CHECK_RESULT(m_pCGBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi,L"C:\\test2.avi",            &m_pMuxFilter,NULL));    CHECK_RESULT(m_pCGBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Audio,            m_pAudioFilter,NULL,this->m_pMuxFilter));    //链接接口    CHECK_RESULT(m_pCGBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,            m_pVideoFilter,m_pComprsFilter,this->m_pMuxFilter));    //获取IFileSinkFilter接口进行设置    IConfigAviMux *pConfig = NULL;    CHECK_RESULT(m_pMuxFilter->QueryInterface(IID_IConfigAviMux,(void**)&pConfig));    pConfig->SetMasterStream(0);    SAFE_RELEASE(pConfig);    m_pMCtrlCam->Run();


[解决办法]
是不是你音量没设置好?
没看出什么问题,我也做了一个,你可以参考看看:
C/C++ code
 
ICaptureGraphBuilder2 * pBuilder = NULL;

pGraph = NULL;

pMediaControl = NULL;

/***********************列举视频设备**************************/
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);

IEnumMoniker *pClassEnum = NULL;
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
if (pClassEnum==NULL)
{
MessageBox(_T("你机器上没装有任何视频捕获设备?"));
return;
}

ULONG cFetched;
BOOL bFind=FALSE;
while (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK) 
{
VARIANT  var; 
VariantInit(&var);
WCHAR szName[50]={0};
IPropertyBag *pBag=0;
  HRESULT hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
    hr = pBag->Read(L"FriendlyName",  &var,  0);
pBag->Release();
if(SUCCEEDED(hr)) 

SysFreeString(var.bstrVal);
// Bind the moniker to a filter object.
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
bFind=TRUE;
break;
}
pMoniker->Release();   
}
pClassEnum->Release();
if (!bFind)
  return;
/***********************列举视频设备**************************/

/***********************列举音频设备开始**************************/
CString strAudioName;
ASSERT(pDevEnum != NULL);
HRESULT hr = pDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pClassEnum, 0);
pDevEnum->Release();
if(hr != NOERROR)
return;
pClassEnum->Reset();

while(hr = pClassEnum->Next(1, &pMoniker, &cFetched), hr==S_OK)
{
IPropertyBag *pBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
pBag->Release();
if(hr == NOERROR)

CString strTemp(var.bstrVal);
strAudioName = strTemp;
SysFreeString(var.bstrVal);
// Bind the moniker to a filter object.
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pAudioSrc);
pMoniker->Release();
break;
}


pMoniker->Release();

}
}
pClassEnum->Release();

/***********************列举音频设备结束**************************/


/**************************创建过滤器*************************/

CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
            IID_IGraphBuilder, (void **)&pGraph);

pBuilder->SetFiltergraph(pGraph);

pGraph->AddFilter(pSrc,L"VideoCapture");
pGraph->AddFilter(pAudioSrc,(LPCWSTR)strAudioName.GetBuffer(0));

pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);

if (!GetVideoCompressor())
{
MessageBox(_T("创建视频编码器失败"));
return;
}
if (!GetAudioCompressor())
{
MessageBox(_T("创建音频编码器失败"));
return;
}

hr = pGraph->AddFilter(pVComp, L"Video Encoder");
if(FAILED(hr))
{
AfxMessageBox(TEXT("Could not add selected compressor to the graph.\r\n\r\n")
TEXT("The input file format may not be compatible with the selected encoder.\r\n")
TEXT("Some encoders (like Windows Media encoders or DRM-enabled encoders)\r\n")
TEXT("cannot be used without appropriate licensing."));
return;
}


hr = pGraph->AddFilter(pAComp, L"Audio Encoder");
if(FAILED(hr))
{
AfxMessageBox(TEXT("Could not add selected audio compressor to the graph."));
return;
}

hr = pBuilder->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.

IConfigAviMux *pConfigMux = NULL;
hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);
if (SUCCEEDED(hr))
{
pConfigMux->SetOutputCompatibilityIndex(TRUE);
pConfigMux->SetMasterStream(1);
pConfigMux->Release();
}

IConfigInterleaving *pInterleave = NULL;
hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave);
if (SUCCEEDED(hr))
{
pInterleave->put_Mode(INTERLEAVE_CAPTURE);
pInterleave->Release();
}

hr = pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Video,    // Media type.
pSrc,          // Capture filter.
pVComp,        // Intermediate filter (Video Encoder).
pMux);        // Mux or file sink filter.

hr = pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Audio,    // Media type.
pAudioSrc,      // Capture filter.
pAComp,          // Intermediate filter (Audio Encoder).
pMux);        // Mux or file sink filter.

pMediaControl->Run();
m_IsRecorded = TRUE;



热点排行