怎样枚举一个pin上的媒体类型?

zengkun100 2008-11-28 04:23:11
我用下面这段代码尝试枚举ac3filter的每个pin上的首选媒体类型,总是不成功。
代码很短,请高手帮忙看看。

int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CLSID clsid;
//安装ac3filter之后可以看到clsid
::CLSIDFromString(_T("{A753A1EC-973E-4718-AF8E-A3F554D45C44}"), &clsid);
IBaseFilter* pFilter = NULL;
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,__uuidof(IBaseFilter), (void **)&pFilter);
IEnumPins* pEnumPins = NULL;
hr = pFilter->EnumPins(&pEnumPins);
if (SUCCEEDED(hr))
{
IPin* pPin = NULL;
while (pEnumPins->Next(1, &pPin, NULL) == S_OK)
{
PIN_DIRECTION pinDir;
//pin的direction可以成功获取,ac3filter上有2个pin,一个in,一个out
pPin->QueryDirection(&pinDir);
IEnumMediaTypes* pEnumMediaTypes = NULL;
HRESULT hr = pPin->EnumMediaTypes(&pEnumMediaTypes);
if (SUCCEEDED(hr))
{
AM_MEDIA_TYPE* pMediaType = NULL;
//试图枚举类型的时候,hr总是返回S_FALSE,pMediaType依然指向NULL
hr = pEnumMediaTypes->Next(1, &pMediaType, NULL);
pEnumMediaTypes->Release();
}
pPin->Release();
}
pEnumPins->Release();
}
return 0;
}
...全文
295 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengkun100 2008-12-05
  • 打赏
  • 举报
回复
yayagirl说的很对,我试演过了。发现有些sourcefilter直接就可以枚举首选类型,而有的则必须先loadfile然后才可以枚举类型。
transform filter即使在连接成功之后也只能枚举到outputint上的类型,而inputin上则枚举不到。
yayagirl 2008-12-03
  • 打赏
  • 举报
回复
这要看该filter是source filter 还是transform filter,如果是source filter一般会直接列举支持的格式,但是
很多transform filter是没有首先格式的在连接前;当然有些filter是可以自己在连接前就设置好首选格式。
zengkun100 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Jartru 的回复:]
你要链接上source filter后再去枚举才有效
[/Quote]
真的?我马上试试看。
Jartru 2008-11-28
  • 打赏
  • 举报
回复
你要链接上source filter后再去枚举才有效

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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