使用directshow播放流媒体,但只能播放部分,好比有的MP3能播放,有的则不能,已经配置了ffdshow,不知道还需要怎么弄,关于filter注册什么的也不太懂 ,新手,求大神解答
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
HRESULT GetUnConnectedPin(IBaseFilter* pFilter,PIN_DIRECTION PinDir,IPin** ppPin)
{
*ppPin=0;
IEnumPins* pEnum=0;
IPin* pPin=0;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}
while (pEnum->Next(1,&pPin,NULL)==S_OK)
{
PIN_DIRECTION ThisPinDir;
pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir==PinDir)
{
IPin* pTem=0;
hr=pPin->ConnectedTo(&pTem);
if (SUCCEEDED(hr))
{
pTem->Release();
}
else
{
pEnum->Release();
*ppPin=pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();
return S_FALSE;
}
int main ()
{ IBaseFilter *pSour=NULL;
IPin *pOut=NULL;
IBaseFilter* pFilter=NULL;
IGraphBuilder* g_pGraphBuilder=NULL;
IMediaControl* g_pMediaControl=NULL;
IMediaPosition* g_pMediaPosition=NULL;
IMediaEvent* pEvent=NULL;
HRESULT hr =CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&g_pGraphBuilder);
hr =g_pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&g_pMediaControl);
if ( FAILED(hr) )
{
g_pGraphBuilder->Release();
return false;
}
hr =g_pGraphBuilder->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
hr =g_pGraphBuilder->QueryInterface(IID_IMediaPosition, (void**)&g_pMediaPosition);
if(pSour)
{
g_pGraphBuilder->RemoveFilter(pSour);
pSour->Release();
}
hr=g_pGraphBuilder->AddSourceFilter(L"E://BaiduMusic/Songs/七月上.mp3",NULL,&pSour);
hr =GetUnConnectedPin(pSour,PINDIR_OUTPUT,&pOut);
if (SUCCEEDED(hr))
{
g_pGraphBuilder->Render(pOut);
pOut->Release();
}
g_pMediaPosition->put_CurrentPosition(0);
hr =g_pMediaControl->Run();
long EventCode;
while (1)
{
pEvent->WaitForCompletion( 100, &EventCode );
if ( (EventCode == EC_COMPLETE) || (EventCode == EC_ERRORABORT) )
{
g_pMediaControl->Stop();
//pEvent->WaitForCompletion( INFINITE, &EventCode );
break;
}
if (::GetAsyncKeyState(VK_SPACE) & 0x8000f)
hr =g_pMediaControl->Run(); // 播放
if (::GetAsyncKeyState('P') & 0x8000f)
hr =g_pMediaControl->Pause(); // 暂停
if (::GetAsyncKeyState('S') & 0x8000f) // 停止
hr =g_pMediaControl->Stop(), g_pMediaPosition->put_CurrentPosition(0);
if (::GetAsyncKeyState(VK_LEFT) & 0x8000f)
{
REFTIME refPosition = 0.0;
hr =g_pMediaPosition->get_CurrentPosition(&refPosition);
refPosition -= 1.0;
if (refPosition <= 0.0) refPosition = 0.0;
hr =g_pMediaPosition->put_CurrentPosition(refPosition);
}
if (::GetAsyncKeyState(VK_RIGHT) & 0x8000f) // 快进
{
REFTIME refPosition = 0.0;
REFTIME refDuration = 0.0;
hr =g_pMediaPosition->get_CurrentPosition(&refPosition);
hr =g_pMediaPosition->get_Duration(&refDuration);// 总长度
refPosition += 1.0;
if (refPosition >= refDuration) refPosition = refDuration;
hr =g_pMediaPosition->put_CurrentPosition(refPosition);
}
if (::GetAsyncKeyState('E') & 0x8000f) //退出
{
hr =g_pMediaControl->Stop();
break;
}
}
CoUninitialize();
SAFE_RELEASE(g_pGraphBuilder);
SAFE_RELEASE(pEvent);
SAFE_RELEASE(g_pMediaControl);
SAFE_RELEASE(g_pMediaPosition);
return 0;
}
为了循环列表 每次都获取一个空闲的pin