刚开始学DirectShow,先自己写了一个播放音乐文件的程序,程序如下:
运行以后没有声音,但是从显示"So it begins"到出现"Press any key to continue"之间的时间和1.wav这个文件的长度是差不都的,但是就是没有声音。用get_Volume()获取音量的话也得到是0,证明音量也没有问题。。。
void PlayAudio()
{
HRESULT hr;
CoInitialize(NULL);
IMediaControl *pCtrl=NULL;
IMediaEvent* pEvent=NULL;
IBaseFilter* pSrc=NULL;//Source Filter
IGraphBuilder* pGraph=NULL;
hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraph);
if (FAILED(hr))
return;
hr=pGraph->AddSourceFilter(L"c:\\sample\\1.wav",L"Source",&pSrc);
if (FAILED(hr))
return;
hr = pGraph->QueryInterface(IID_IMediaControl,(void**)&pCtrl);
if (FAILED(hr))
return;
hr = pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
if (FAILED(hr))
return;
IPin* pPin=GetOutPin(pSrc,0);
hr=pGraph->Render(pPin);
if (FAILED(hr))
return;
hr=pCtrl->Run();
if (FAILED(hr))
return;
cout<<"So it begins"<<endl;
long evCode;
pEvent->WaitForCompletion(INFINITE,&evCode);
}
GetOutPin函数是从DShow自带的Sample里拿过来的,具体实现如下:
IPin * GetOutPin( IBaseFilter * pFilter, int nPin )
{
CComPtr<IPin> pComPin=0;
GetPin(pFilter, PINDIR_OUTPUT, nPin, &pComPin);
return pComPin;
}
HRESULT GetPin( IBaseFilter * pFilter, PIN_DIRECTION dirrequired, int iNum, IPin **ppPin)
{
CComPtr< IEnumPins > pEnum;
*ppPin = NULL;
HRESULT hr = pFilter->EnumPins(&pEnum);//hrererer!!!!!!!!!!!!
if(FAILED(hr))
return hr;
ULONG ulFound;
IPin *pPin;
hr = E_FAIL;
while(S_OK == pEnum->Next(1, &pPin, &ulFound))
{
PIN_DIRECTION pindir = (PIN_DIRECTION)3;
pPin->QueryDirection(&pindir);
if(pindir == dirrequired)
{
if(iNum == 0)
{
*ppPin = pPin; // Return the pin's interface
hr = S_OK; // Found requested pin, so clear error
break;
}
iNum--;
}
pPin->Release();
}
return hr;
}
声卡什么应该没有问题,在GraphEdit里构建一个链路的话也能正常播放=。=不知道为什么啊,小弟第一次发帖,希望有大牛能够解答一下,感激不尽
谢谢!
3 个解决方案
#1
直接RenderFile试试。
#2
void TestPro()
{
HRESULT hr;
CoInitialize(NULL);
IMediaControl *pCtrl=NULL;
IMediaEvent* pEvent=NULL;
IGraphBuilder* pGraph=NULL;
hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraph);
if (FAILED(hr))
return;
IBaseFilter* pSrc=NULL;
hr=pGraph->RenderFile(L"c:\\sample\\1.wav",NULL);
if (FAILED(hr))
return;
hr = pGraph->QueryInterface(IID_IMediaControl,(void**)&pCtrl);
if (FAILED(hr))
return;
hr = pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
if (FAILED(hr))
return;
hr=pCtrl->Run();
if (FAILED(hr))
return;
cout<<"So it begins"<<endl;
long eCode;
pEvent->WaitForCompletion(INFINITE,&eCode);
}
是这样么?还是没有声音。。。效果和之前那个程序一样……
这个是我之前写过的一个程序,当时是有声音的,后来我在这个程序基础上又加了一些东西,发现不能用了,就改回去从头找问题出在哪儿,今天纠结了半天还是不能用……呃,所以发上来看看程序有没有问题=。=
我就是很奇怪,从我输出字符"So it begins"到程序结束,确实是有一段时间的,这个时间和文件长度是差不多的,但是却听不到声音……
#3
问题找到了
之前想要做个混音,在老外的网站上下了一个叫MatrixMix的Filter,这个Filter可以改变各个声道的音量,但是这个Filter应该是有比较高的Merit值,所以自动连接到Source和Render之间了。而这个Filter如果设置的音频格式和输入的音频格式不符的话就没有声音,但是FilterGraph依然可以运行下去。我把这个Filter从注册表删除之后发现之前的程序可以正常运行了。
看来问题真的出在这里,谢谢各位!
之前想要做个混音,在老外的网站上下了一个叫MatrixMix的Filter,这个Filter可以改变各个声道的音量,但是这个Filter应该是有比较高的Merit值,所以自动连接到Source和Render之间了。而这个Filter如果设置的音频格式和输入的音频格式不符的话就没有声音,但是FilterGraph依然可以运行下去。我把这个Filter从注册表删除之后发现之前的程序可以正常运行了。
看来问题真的出在这里,谢谢各位!
#1
直接RenderFile试试。
#2
void TestPro()
{
HRESULT hr;
CoInitialize(NULL);
IMediaControl *pCtrl=NULL;
IMediaEvent* pEvent=NULL;
IGraphBuilder* pGraph=NULL;
hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraph);
if (FAILED(hr))
return;
IBaseFilter* pSrc=NULL;
hr=pGraph->RenderFile(L"c:\\sample\\1.wav",NULL);
if (FAILED(hr))
return;
hr = pGraph->QueryInterface(IID_IMediaControl,(void**)&pCtrl);
if (FAILED(hr))
return;
hr = pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
if (FAILED(hr))
return;
hr=pCtrl->Run();
if (FAILED(hr))
return;
cout<<"So it begins"<<endl;
long eCode;
pEvent->WaitForCompletion(INFINITE,&eCode);
}
是这样么?还是没有声音。。。效果和之前那个程序一样……
这个是我之前写过的一个程序,当时是有声音的,后来我在这个程序基础上又加了一些东西,发现不能用了,就改回去从头找问题出在哪儿,今天纠结了半天还是不能用……呃,所以发上来看看程序有没有问题=。=
我就是很奇怪,从我输出字符"So it begins"到程序结束,确实是有一段时间的,这个时间和文件长度是差不多的,但是却听不到声音……
#3
问题找到了
之前想要做个混音,在老外的网站上下了一个叫MatrixMix的Filter,这个Filter可以改变各个声道的音量,但是这个Filter应该是有比较高的Merit值,所以自动连接到Source和Render之间了。而这个Filter如果设置的音频格式和输入的音频格式不符的话就没有声音,但是FilterGraph依然可以运行下去。我把这个Filter从注册表删除之后发现之前的程序可以正常运行了。
看来问题真的出在这里,谢谢各位!
之前想要做个混音,在老外的网站上下了一个叫MatrixMix的Filter,这个Filter可以改变各个声道的音量,但是这个Filter应该是有比较高的Merit值,所以自动连接到Source和Render之间了。而这个Filter如果设置的音频格式和输入的音频格式不符的话就没有声音,但是FilterGraph依然可以运行下去。我把这个Filter从注册表删除之后发现之前的程序可以正常运行了。
看来问题真的出在这里,谢谢各位!