一个简单的DirectShow播放音频的程序,却没有声音

时间:2023-01-30 09:23:39
Hi
刚开始学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


引用 1 楼 dream238 的回复:
直接RenderFile试试。


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从注册表删除之后发现之前的程序可以正常运行了。

看来问题真的出在这里,谢谢各位!

#1


直接RenderFile试试。

#2


引用 1 楼 dream238 的回复:
直接RenderFile试试。


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从注册表删除之后发现之前的程序可以正常运行了。

看来问题真的出在这里,谢谢各位!