directshow播放流媒体

ProMathew 2016-06-30 01:55:24
使用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
...全文
1416 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
银点 2016-07-13
  • 打赏
  • 举报
回复
1、有自己写的filter么? 2、在graphedit里能不能播放?不能播放就在graphedit里调试filter吧

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧