DShow IAMStreamConfig获取失败,请帮忙解决

pluswaylee 2009-05-05 09:13:05
以下是相关的代码,不相关的我没有贴出来,怕影响各位阅读。问题出在ResizeVideo函数里,我在这个函数中调用m_ICapture->FiindInterface(...)后,不能获取IAMStreamConfig接口的指针。我单步到这里,感觉前面初始化没有问题。请大家帮忙找一下问题的原因。

class
{
public:
bool InitVideo(HWND hwnd)
{
CoInitialize(0);

HRESULT hr = 0;

hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_IGraph);
if (FAILED(hr)) return false;

hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void**)&m_ICapture);
if (FAILED(hr)) return false;

hr = m_ICapture->SetFiltergraph(m_IGraph);
if (FAILED(hr)) return false;

hr = CoCreateInstance(CLSID_VideoMixingRenderer, NULL,
CLSCTX_INPROC, IID_IBaseFilter, (void**)&m_IVMR);

hr = m_IGraph->AddFilter(m_IVMR, L"Video Mixing Renderer");
if (FAILED(hr)) return false;
}
void ResizeVideo
{
HRESULT hr = 0;

VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE* pmt = 0;
IAMStreamConfig* m_pVSC = 0;

//Problem here
hr = m_ICapture->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Interleaved, m_IVMR, IID_IAMStreamConfig, (void**)&m_pVSC);
}
private:
IGraphBuilder* m_IGraph;
ICaptureGraphBuilder2* m_ICapture;
IBaseFilter* m_IVMR;
};
...全文
246 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangzhx3 2009-05-06
  • 打赏
  • 举报
回复
mark
明天看看.
zhangzhx3 2009-05-06
  • 打赏
  • 举报
回复
代码差不多了,其实就没有必要发了,我觉得不是代码的问题.
会不会是你正在RUN,可能出现问题;你试试stop以后,再捕获接口.
pluswaylee 2009-05-06
  • 打赏
  • 举报
回复
To:bottlebox

我不是想控制摄像头,一开始我说一下目的好了,我的目的是要用DSHOW更改视频源大小后,输出视频,功能一点都不复杂。

所以我必须获得IAMStreamConfig这个接口指针,然后GetFormat/SetFormat 这样。

各位觉得必要的话,我可以补一下源代码。我开始没贴是因为怕看着太乱。
瓶盒 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pluswaylee 的回复:]
To:bottlebox
//Problem here
hr = m_ICapture->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Interleaved, m_IVMR, IID_IAMStreamConfig, (void**)&m_pVSC);
是啊。。。。而且这个函数的参数就是要IBaseFilter指针。。。
[/Quote]
如果你的代码是想控制摄像头,那么这里的m_IVMR应该是一个capture device Filter,也就是通过设备枚举获得的一个IBaseFilter指针
pluswaylee 2009-05-06
  • 打赏
  • 举报
回复
To:bottlebox

//Problem here
hr = m_ICapture->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Interleaved, m_IVMR, IID_IAMStreamConfig, (void**)&m_pVSC);

是啊。。。。而且这个函数的参数就是要IBaseFilter指针。。。




pluswaylee 2009-05-06
  • 打赏
  • 举报
回复
To:zhangzhx3

这两个参数我都试过,都不行。

或者你发下可编译完整代码,借我看看。THX
zhangzhx3 2009-05-06
  • 打赏
  • 举报
回复
楼主,我帮你试了一下.
应该是这个问题:
MEDIATYPE_Interleaved,这个参数的问题,没有接口说的应该是这个;用这个MEDIATYPE_Video就好了.
pluswaylee 2009-05-06
  • 打赏
  • 举报
回复
我把很多模块都去掉后,只留这一个视频播放模块后,试验的,但貌似也不好用,分饼干,闪人。。。自己再研究一下
瓶盒 2009-05-05
  • 打赏
  • 举报
回复
m_IVMRj是一个RenderFilter吗?RenderFilter是没有这个接口的,一般是从CapSourceFilter获得这个接口
WaistCoat19 2009-05-05
  • 打赏
  • 举报
回复
DShow偶也没弄个。

出现这种情况的可能是:
1)DirectX SDK的版本不够新
2)PIN_CATEGORY_CAPTURE的pin就没有实现IAMStreamConfig接口
pluswaylee 2009-05-05
  • 打赏
  • 举报
回复
DShow版本我也不知道,VC2008自带的SDK里的
pluswaylee 2009-05-05
  • 打赏
  • 举报
回复
是我DShow版本的问题?

看返回值,是说我没接口,我也奇怪。。。
WaistCoat19 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pluswaylee 的回复:]
hr == E_NOINTERFACE  这个
[/Quote]

你的DShow什么版本啊,如果你代码没问题说明没这个接口啊。
pluswaylee 2009-05-05
  • 打赏
  • 举报
回复
GetLastError()的结果是:“在活动的激活上下文中没有找到任何查找密钥。"
pluswaylee 2009-05-05
  • 打赏
  • 举报
回复
hr == E_NOINTERFACE 这个
WaistCoat19 2009-05-05
  • 打赏
  • 举报
回复
hr = m_ICapture->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Interleaved, m_IVMR, IID_IAMStreamConfig, (void**)&m_pVSC);
hr的值是多少?

16,471

社区成员

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

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

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