DirectShow的几段代码问题

huazaimh 2010-07-29 11:09:00
现在我要控制多声卡输出,思路已经有了,代码也找到相似的
但是有点疑问,先贴代码如下:
----------------------------------------------------
BOOL CDSPlayer::RenderFile(const char * inFile)
{
if ( mGraph )
{
if ( !Stop () ) return FALSE;
if ( mAudioFilter )
{
mGraph->RemoveFilter ( mAudioFilter );
mAudioFilter->Release ();
mAudioFilter = NULL;
}

WCHAR wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, inFile, -1, wsz, MAX_PATH);
if (SUCCEEDED(mGraph->RenderFile(wsz, NULL)))//
{

mAudioFilter = FindFilters ( inFile ); //
m_csMediaFileName = inFile;

SetNotifyWindow ( m_hWndNotify );
SetDisplayWindow ( m_hWndDisplay );


return TRUE;
return ( mAudioFilter != NULL );
}
}
return FALSE;
}

IBaseFilter* CDSPlayer::FindFilters ( const char *szFilterName )
{
if( !mGraph ) return NULL;
IEnumFilters *pFilters = NULL;


if ( FAILED(mGraph->EnumFilters(&pFilters)))
return NULL;

IBaseFilter *pFilter = NULL, *pFilter_Find = NULL;
ULONG n = 0;

while ( pFilters->Next(1, &pFilter, &n) == S_OK )
{
FILTER_INFO info;
if ( FAILED(pFilter->QueryFilterInfo(&info)) )
{
TRACE ( "Filter [%x] -- failed QueryFilterInfo\n", pFilter );
}
else
{
CString csAchName = info.achName;
TRACE ( "%s\n", csAchName );
if ( csAchName.Find ( szFilterName, 0 ) >= 0 )
{
pFilter_Find = pFilter;
}
else
{
pFilter->Release();
}
}
}

pFilters->Release();

return pFilter_Find;
}
----------------------------------------------------
问题如下:

该两个函数代码经测试没有问题,但是本人有疑问:
RenderFile(const char * inFile)是将指定的文件输出到声卡上

问题1:
mAudioFilter = FindFilters ( inFile ); //
m_csMediaFileName = inFile;
    这里是找到真正播放这个文件的Filter,保存到mAudioFilter中,为什么能做到这个呢?通过的文件名关联?系统是如何分配的?

问题2:
    在IBaseFilter* CDSPlayer::FindFilters ( const char *szFilterName )中
    里面有一个遍历,取每个Filter的信息,然后看看里面的信息是否有播放的文件名,如果有,则把该Filter置为当前的Filter,也即播放当前文件的Filter,这里的理解应该没有问题吧?

    在这里我有一个问题,我既然可以选择声卡,那根据声卡的,选择的Filter,应该当时就能确定,应该可以不用这一步,是不是?我直接可以改进的,选择声卡后,对应的Filter即可确定。


   另外:在BOOL CDSPlayer::RenderFile(const char * inFile)中,没有看到具体用找到的Filter来播放,那选择岂不是无意义?

   望各位高手指点一下,谢谢!

...全文
54 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
huazaimh 2010-07-30
  • 打赏
  • 举报
回复
现在有这样的问题,我能控制播放了
可是第二次再播放就有问题了,始终播放出来
if (!gDsPlayer.IsStopped())
{
AfxMessageBox("No Stoped!");
gDsPlayer.Stop();
}//这里开始没有,后来加进来,依然不行
LPCTSTR lpszMediaFileName("C:\\Documents and Settings\\mhua\\桌面\\不是因为寂寞才想你.mp3");
if ( !gDsPlayer.RenderFile ( lpszMediaFileName ) )
return ;
// gDsPlayer.Delete_DefaultDirectSoundDevice (); //d
if ( !gDsPlayer.Run() )
return ;

第一次能正常播放,后面不能正常播放
stonewater 2010-07-29
  • 打赏
  • 举报
回复
你得看看directshow方面的书
huazaimh 2010-07-29
  • 打赏
  • 举报
回复
Nobody?
rageliu 2010-07-29
  • 打赏
  • 举报
回复
filter都有注册信息的,通过这个可以判断
huazaimh 2010-07-29
  • 打赏
  • 举报
回复
基本清楚这个东东了,想验证一下

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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