2013-02-20 15 views
0

我只想播放來自視頻文件的音頻。爲此,我將使用directshow SampleGrabber與Major_type設置爲MEDIATYPE_Audio和DirectSound Audio Renderer。與Microsoft DTV-DVD音頻解碼器和Direct Sound Renederer一起使用SampleGrabber時,無法渲染Streamstream

這適用於.wmv文件。但是,當我嘗試播放.mp4文件時。 RenderStream失敗。

然後我試圖與以下filtet創造GrapStudioNext濾波器

文件來源 - > LAV分離器(自動加載) - > SampleGrabber-> MS DTV-DVD音頻Decoder->默認DirectSoude設備

上面過濾器工作正常,我要聽音頻。

但是,當我在vC++中手動創建相同的過濾器圖形。該RenderStream通話,而源過濾器連接到SampleGrabber

HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
         IID_IGraphBuilder, (void **)&m_pGraph); 
if(FAILED(hr)) 
{ 
ReleaseResource(); 
return hr; 
} 

hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, 
     (void **)&m_pBuilder); 
    if (SUCCEEDED(hr)) 
    { 
     m_pBuilder->SetFiltergraph(m_pGraph); 
    } 
else 
{ 
std::cout<<"Failed to Created Capture Graph"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = m_pGraph->QueryInterface(IID_IMediaControl, (void**)&m_pControl); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Get Media Control Interface"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void**)&m_pEvent); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Get Media Event"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = m_pGraph->QueryInterface(IID_IMediaSeeking, (void**)&m_pMediaSeek); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Get Media Seeking"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = m_pGraph->QueryInterface(IID_IBasicAudio, (void**)&m_pBasicAudio); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Get Basic Audio"<<std::endl; 
ReleaseResource(); 
return hr; 
} 
#if 0 
hr = CoCreateInstance(CLSID_AudioRender, NULL, CLSCTX_INPROC_SERVER, 
IID_IBaseFilter, (void**)&m_pBaseFilter); 
#endif 

hr = CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, 
IID_IBaseFilter, (void**)&m_pBaseFilter); 

if(FAILED(hr)) 
{ 
std::cout<<"Failed to Create Audio Render"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = m_pGraph->AddFilter(m_pBaseFilter, L"Audio Filter"); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Add Audio Render"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = m_pGraph->AddSourceFilter((LPCWSTR)wxStr,L"SourceFlt", &m_pSourceFilter); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Add Source Filter"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, 
IID_IBaseFilter, (void**)&m_pBaseFilterSG); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Create Sample Grabber"<<std::endl; 
ReleaseResource(); 
return 1; 
} 

hr = m_pGraph->AddFilter(m_pBaseFilterSG, L"Sample_Grabber"); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Add Sample Grabber"<<std::endl; 
ReleaseResource(); 
return 1; 
} 

hr = m_pBaseFilterSG->QueryInterface(IID_ISampleGrabber, (void**)&m_pSampleGrabber); 

if(FAILED(hr)) 
{ 
std::cout<<"Query Interface Failed for Sample Grabber"<<std::endl; 
ReleaseResource(); 
return 1; 
} 
ZeroMemory(&mt, sizeof(mt)); 
mt.majortype = MEDIATYPE_Audio; 
mt.subtype = MEDIASUBTYPE_RAW_AAC1; 
hr = m_pSampleGrabber->SetMediaType(&mt); 

    if(FAILED(hr)) 
{ 
std::cout<<"Failed to Set Media Type"<<std::endl; 
ReleaseResource(); 
return 1; 
} 

hr = CoCreateInstance(CLSID_CMPEG2AudDecoderDS , NULL, CLSCTX_INPROC_SERVER, 
IID_IBaseFilter, (void**)&m_pMSAduioDecoder); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Create Sample Grabber"<<std::endl; 
ReleaseResource(); 
return 1; 
} 

hr = m_pGraph->AddFilter(m_pMSAduioDecoder, L"Audio_Decoder"); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Add Adudio Decoder"<<std::endl; 
ReleaseResource(); 
return 1; 
} 

hr = m_pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio,m_pSourceFilter, m_pBaseFilterSG,m_pMSAduioDecoder); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Render First Chain"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

    hr = m_pBuilder->RenderStream(NULL, NULL,m_pMSAduioDecoder,NULL, m_pBaseFilter); 
if(FAILED(hr)) 
{ 
std::cout<<"Failed to Render Second Chain"<<std::endl; 
ReleaseResource(); 
return hr; 
} 

還當我SetMediaType到MEDIATYPE_Video第一鏈連接正確失敗。但是即使在使用PIN_CATEOGARY_CAPTURE和MediaType_Audio之後,其中一秒也會失敗。

此外,我在RenderStream無效參數錯誤。

請提出可能會出現什麼問題。提前致謝。

Pradeep

回答

0

這是完全錯誤的。您根本沒有捕獲源,因此嘗試利用Capture Graph Builder首先是很弱的。您的圖表中沒有單個銷釘,即PIN_CATEGORY_CAPTURE,因此它失敗。

你知道所有你需要使用,CoCreateInstanceIGraphBuilder::AddFilterIPin::Connect足以構建圖形過濾器,你不需要捕獲圖形建設者在這裏所有。

+0

好吧,其實我想使用RenderStream進行智能連接,所以想到使用Capture圖形生成器。我也嘗試使用NULL而不是PIN_CATEGORY_CAPTURE,但它未能連接。我之前使用過IPin :: Connect時,我想捕捉視頻效果很好。我會嘗試使用相同的。謝謝 – praks411 2013-02-21 08:13:37

+0

我能夠播放大多數格式。 – praks411 2013-02-21 10:23:48

相關問題