有关directshow中dmo使用的问题

xjgycc 2006-11-28 11:28:26
IMediaControl *pMediaControl;
CComPtr<IBaseFilter> pAudioEncoder;
CComPtr<IDMOWrapperFilter> pAudioWrapperFilter;

HRESULT hr;
CoInitialize(NULL);

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraphBuilder);
pGraphBuilder->QueryInterface(IID_IMediaControl,(void **)&pMediaControl);



pAudioEncoder.CoCreateInstance( CLSID_DMOWrapperFilter );
pAudioEncoder.QueryInterface(&pAudioWrapperFilter);

pAudioWrapperFilter->Init( CLSID_MyDMO,CLSID_MyCTO);
hr = pGraphBuilder->AddFilter(pAudioEncoder,L"mp3");
if(!SUCCEEDED(hr))
{
MessageBox(L"add filter unsucceeded!");
}

hr=pGraphBuilder->RenderFile( L"\\08.mp3", NULL );
到addfilter都成功了,为什么renderFile这里会不成功呢???还是还要做些什么工作
我是在ce下做,不能放mp3,但注册表里已经有mp3的DMO了
...全文
317 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovegeng 2006-12-01
  • 打赏
  • 举报
回复
hr = pInputPin->ConnectedTo(&pUpstreamOutputPin);

加上这一句做什么用???调用了GetUnconnectedPin为何还要
hr = pInputPin->ConnectedTo(&pUpstreamOutputPin);
xjgycc 2006-11-30
  • 打赏
  • 举报
回复
自己加了filter后可以直接Renderfile吗??
toxyboy 2006-11-30
  • 打赏
  • 举报
回复
晕,直接Renderfile()就可以了啊.系统会调用自己的解码器的...
xjgycc 2006-11-30
  • 打赏
  • 举报
回复
我试了一下以上方法:
hr = GetUnconnectedPin(pRenderer,PINDIR_OUTPUT,&pUpstreamOutputPin);
hr = pInputPin->ConnectedTo(&pUpstreamOutputPin);
hr = g_pGraph->Connect(pUpstreamOutputPin,pInputPin);
但为什么还是没连起来呢,我想问下,如果有DMO的话,是不是就可以解码mp3了??
lovegeng 2006-11-29
  • 打赏
  • 举报
回复
ConnectedTo()的功能是Retrieves the pin connected to this pin.
即返回连接着的pin,注意这里是connected,即之前已经连接上了的pin,你的pin还没有连接,应该返回错才对
xjgycc 2006-11-29
  • 打赏
  • 举报
回复
谢谢楼上的,我也在想这个问题,我照pc上sdk的例子
hr = GetPin(pAudioEncoder, PINDIR_INPUT, 0, &pInputPin);
if (FAILED(hr))
{
MessageBox(L"error1");
}
hr = pInputPin->ConnectedTo(&pUpstreamOutputPin);
// hr = m_pGB->Connect(pUpstreamOutputPin,pInputPin);
if (FAILED(hr))
{
MessageBox(L"error2");
}
hr = m_pGB->Render(pUpstreamOutputPin);
if (FAILED(hr))
{
MessageBox(L"error3");
}
hr = m_pGB->RenderFile(L"\\Storage Card\\sss.mp3", NULL);

但每次到pInputPin->ConnectedTo(&pUpstreamOutputPin);就出错,hr failed
lovegeng 2006-11-29
  • 打赏
  • 举报
回复
HRESULT GetUnconnectedPin(
IBaseFilter *pFilter,
PIN_DIRECTION PinDir,
IPin **ppPin)
{
*ppPin = NULL;
IEnumPins *pEnum = NULL;
IPin *pPin = NULL;

HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}

while (pEnum->Next(1, &pPin, NULL) == S_OK)
{
PIN_DIRECTION ThisPinDir;
hr = pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir == PinDir)
{
IPin *pTmp = NULL;
hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr))
{
/* Already connected, not the pin we want. */
pTmp->Release();
}
else
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();

/* Did not find a matching pin. */
return E_FAIL;
}

开发指南上讲了如何得到一个没有连接的pin
xjgycc 2006-11-29
  • 打赏
  • 举报
回复
恩,这也是我搞不清楚sdk里为什么这么写,那我怎么去连outpin呢
xjgycc 2006-11-28
  • 打赏
  • 举报
回复
返回0x80040218 ,我想问下,我这样使用DMO是正确的吗
rageliu 2006-11-28
  • 打赏
  • 举报
回复
hr=pGraphBuilder->RenderFile( L"08.mp3", NULL );

返回什么错误?
lovegeng 2006-11-28
  • 打赏
  • 举报
回复
我觉得思路不太对,Renderfile的话就是智能连接,不一定会使用用AddFilter中加入的Filter了,既然用了AddFilter,就应该用Render(pOutPin)的方法来实现吧。
先得到pAudioEncoder的pOutPin,再Render。
xjgycc 2006-11-28
  • 打赏
  • 举报
回复
用了DMO还需要解码器吗???应为windows mobile里有wmplayer,可以放mp3的
  • 打赏
  • 举报
回复
你先确定可以播放mp3,不知道windows mobile上有没有GraphEdit,最好能看下是怎么连接的

应该不用加了,初始化好就和其它filter一样用了,我只用过wmv解码器,是这样工作的啊
xjgycc 2006-11-28
  • 打赏
  • 举报
回复
是不是要还要加Ipin???
xjgycc 2006-11-28
  • 打赏
  • 举报
回复
我是在windows mobile的,原理应该都一样,我在注册表里也看到了mp3的DMO,阿杜的addfilter也成功,就是放不出声音来
  • 打赏
  • 举报
回复
我用的xp,原理应该是差不多吧

在GraphEdit中连接,看用了哪些Filter,是否audio decoder确实能用,如果不行就装解码器
另外,文件路径为什么要加"\\"呢

很少看到有dmo的问题,我也有这方面问题。代码调用,和我的应该是一样的,贴一段我的代码,交流,不对的请指出哈

-------------------

CComPtr<IBaseFilter> pDMOFilter;

// Create the DMO Wrapper filter.
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
CLSCTX_INPROC_SERVER, IID_IBaseFilter,
reinterpret_cast<void**>(&pDMOFilter));

if (SUCCEEDED(hr))
{
// Query for IDMOWrapperFilter.
CComPtr<IDMOWrapperFilter> pDmoWrapper;
hr = pDMOFilter->QueryInterface(IID_IDMOWrapperFilter,
reinterpret_cast<void**>(&pDmoWrapper));

if (SUCCEEDED(hr))
{
// Initialize the filter.
hr = pDmoWrapper->Init(GUID_CurDMO, GUID_WhatCategory); /*DMOCATEGORY_VIDEO_EFFECT*/

if (SUCCEEDED(hr))
{
// Add the filter to the graph.
hr = m_pGB->AddFilter(pDMOFilter, L"DMO");
if(SUCCEEDED(hr))
{
//do something.

return S_OK;
}
}
}
}//if


16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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