5175|19

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

evc 播放avi,没有图像 [复制链接]

void CNewAviTestDlg::OnButton1()   
{  
// TODO: Add your control notification handler code here  
IGraphBuilder   *m_pGraph;     
    IMediaControl   *m_pControl;     
    IMediaEventEx     *m_pEvent;   
IVideoWindow  *m_pVideoWindow;  
    CoInitialize(NULL);   

HWND   hWnd;   
hWnd = GetDlgItem(IDC_STATIC_MPEG)->m_hWnd;   

HRESULT hr;   

    //free(); //Deletes any previous DirectShow instances   
    hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraph);   
    if (!SUCCEEDED(hr))   
{   
MessageBox(_T("CoCreateInstance failed"));   
}   
    hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl);   
    if (!SUCCEEDED(hr))   
{   
MessageBox(_T("IID_IMediaControl failed"));   
}   
    hr = m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);   
    if (!SUCCEEDED(hr))   
{   
MessageBox(_T("IID_IMediaEventEx failed"));   
}   

    hr = m_pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0);   
    if (!SUCCEEDED(hr))   
{   
MessageBox(_T("SetNotifyWindow  failed"));   
}   


    hr = m_pGraph->RenderFile(_T("C\\爱我别走.avi"), NULL);   
    if (!SUCCEEDED(hr))   
{   
MessageBox(_T("RenderFile  failed"));   
        //m_pMediaPlayerLog->WriteOut("RenderFile  failed,RESULT:0x%x",hr);   
}   
    hr = m_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVideoWindow);   
    if (!SUCCEEDED(hr))   
{   
MessageBox(_T("IID_IVideoWindow  failed"));   
    }   

SetWindowLong(hWnd,GWL_STYLE,GetWindowStyle(hWnd)  ?WS_CLIPCHILDREN);  
    hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);// 这里报错,失败了  
    if (!SUCCEEDED(hr))   
{   
   MessageBox(_T("put_Owner failed"));  
     }   
    hr = m_pVideoWindow->put_WindowStyle(WS_CHILD   ?WS_CLIPCHILDREN   ?WS_CLIPSIBLINGS); //然后这里也会报错 ,失败了
     if (!SUCCEEDED(hr))   
{   
MessageBox(_T("put_WindowStyle  failed"));  
         //m_pMediaPlayerLog->WriteOut("put_WindowStyle  failed,RESULT:0x%x",hr);   
}   
     hr = m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);//然后这里也会报错 ,失败了
     if (!SUCCEEDED(hr))   
{   
MessageBox(_T("put_MessageDrain  failed"));  
     //m_pMediaPlayerLog->WriteOut("put_MessageDrain  failed,RESULT:0x%x",hr);   
}   
     hr = m_pVideoWindow->put_Visible(OATRUE); //最后是这里也会报错 ,失败了
     if (!SUCCEEDED(hr))   
{   
MessageBox(_T("put_Visible  failed"));  
     //m_pMediaPlayerLog->WriteOut("put_Visible  failed,RESULT:0x%x",hr);   
}   

     RECT grc;   
     GetClientRect(&grc);   
     m_pVideoWindow->SetWindowPosition(289,81,704,585);   
     m_pVideoWindow->put_Visible(OATRUE);   

m_pControl->Run();   

}  
    哪位大侠能告诉我,我的m_pVideoWindow->put_Owner((OAHWND)hWnd),  
                           m_pVideoWindow->put_WindowStyle(WS_CHILD   ?WS_CLIPCHILDREN   ?WS_CLIPSIBLINGS);  
                       m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);  
                       m_pVideoWindow->put_Visible(OATRUE);   
                    都错在哪里?谢谢!!!

最新回复

要把graph里的filter链路建好才能行  详情 回复 发表于 2008-8-6 22:51
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
报错,是什么错误呢?
LZ不会是想让大家猜是什么错误吧!
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这位大侠说的是,我把出错的地方代码改成了输出错误代码信息了,如:
hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);//
    if (!SUCCEEDED(hr))
        {
           strError.Format(_T("put_Owner出错:%d"),GetLastError());
           MessageBox(strError);
     }
    hr = m_pVideoWindow->put_WindowStyle(WS_CHILD  |WS_CLIPCHILDREN  |WS_CLIPSIBLINGS);
     if (!SUCCEEDED(hr))
         {
                 //MessageBox(_T("put_WindowStyle  failed"));
                 strError.Format(_T("put_WindowStyle出错:%d"),GetLastError());
             MessageBox(strError);
         }
     hr = m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);//将所有消息传给父窗体处理
     if (!SUCCEEDED(hr))
         {
                 //MessageBox(_T("put_MessageDrain  failed"));
         strError.Format(_T("put_MessageDrain出错:%d"),GetLastError());
             MessageBox(strError);
         }
     hr = m_pVideoWindow->put_Visible(OATRUE);
     if (!SUCCEEDED(hr))
         {
                 //MessageBox(_T("put_Visible  failed"));
         strError.Format(_T("put_Visible出错:%d"),GetLastError());
             MessageBox(strError);
         }

     RECT grc;
     GetClientRect(&grc);
     m_pVideoWindow->SetWindowPosition(289,81,704,585);
     m_pVideoWindow->put_Visible(OATRUE);

     m_pControl->Run();

输出的错误信息为:
put_Owner出错: 0
put_WindowStyle出错: 6
put_MessageDrain出错:6
put_Visible出错: 6
请大侠指教,非常感谢!谢谢!!!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
看看这片文章。

http://www.directshow.cn/site/?action-viewthread-tid-448
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
错误6,是句柄无效。
LZ看看给的句柄是否正确呢?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
还是想不通为什么put_Owner出错: 0,0代表什么呢?

put_WindowStyle出错: 6
put_MessageDrain出错:6
put_Visible出错: 6
为什么呢?函数返回句柄应该是HRESULT的呀,没有错呀。
晕!!!
还是请知道详情的大侠们帮帮忙,具体指导一下该怎么做。非常感谢!!!谢谢!
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
你的句柄名怎么这么怪啊,应该是this->m_hWnd;吧 hWnd是哪来的,而且也不用转换格式啊,0代表正常,你可以看看头文件里S_OK的定义
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
你的CLSID_FilterGraph初始化完成了没有,虽然我不懂这个,但是随手查了几个例子,
觉得你的初始化好像和它们不一样。
不知道你仔细看了没有我给你的连接。

还是想不通为什么put_Owner出错: 0,0代表什么呢?    ///0当然是代表有问题。为什么呢,肯定是你的代码不对

put_WindowStyle出错: 6     //这几个6表示使用句柄无效,当然了。你使用的是put_Owner返回的无效句柄,肯定是返回这个错误代码了。
put_MessageDrain出错:6                          
put_Visible出错: 6                             
为什么呢?函数返回句柄应该是HRESULT的呀,没有错呀。       //返回 HRESULT 难道就不能有错了?

要多怀疑自己的代码,不要怀疑机制问题。流行的代码不可能这么容易被你找到BUG的。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
TO: lenux 我看了http://www.directshow.cn/site/?action-viewthread-tid-448,结果发觉和我的差不多,也是那样的问题好像。而现在既然肯定是hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);有问题,
所以我把代码  
hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);//  
    if (!SUCCEEDED(hr))  
{  
   strError.Format(_T("put_Owner出错:%d"),GetLastError());  
   MessageBox(strError);
}  
改成了:
hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);//
    if (!SUCCEEDED(hr))
        {
                  strError.Format(_T("put_Owner出错:%x"),hr);
                MessageBox(strError);
                strError.Format(_T("put_Owner出错:%d"),hr);
                MessageBox(strError);
                strError.Format(hr);
           MessageBox(strError);
     }
察看输出结果:
第一个对话框显示:put_Owner出错:80004002
第二个对话框显示:put_Owner出错:-2147467262
第三个对话框是空白
噢,对了,等所有的报错对话框都关闭(包括:put_WindowStyle出错: 6 put_MessageDrain出错:6            
put_Visible出错: 6 这三个对话框),最后听到卡的一声。没有其他的声音和图像。
是不是因为返回的hr 是NULL阿?我查MSDN上只说Return Value,Returns an HRESULT value. 根本没有其他的说明。所以希望谁碰到过类似的问题或者代码请指教!
在此真的谢谢大家的帮助!谢谢!
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
#define E_NOINTERFACE                    _HRESULT_TYPEDEF_(0x80004002L)
检查一下你的m_pVideoWindow和hWnd是否合法,再不行去流媒体开发版问问,这是dshow的问题
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

11
 
我在其他网页上找到一段代码:
        IGraphBuilder   *pGraph   =   NULL;   
        IMediaControl   *pControl   =   NULL;   
        IMediaEvent       *pEvent   =   NULL;   
        IVideoWindow     *pVidWin   =   NULL;   
      
        HRESULT   hr   =   CoInitialize(NULL);   
        if   (FAILED(hr))   
        {   
           printf("ERROR - Could not initialize COM library");   
                return;   
        }   
          
        hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraph);   
        if   (FAILED(hr))   
        {   
                printf("ERROR - Could notcreate the Filter Graph Manager.");   
                return;   
        }   
        hr   =   pGraph->QueryInterface(IID_IMediaControl,   (void   **)&pControl);   
        hr   =   pGraph->QueryInterface(IID_IMediaEvent,   (void   **)&pEvent);   
        hr   =   pGraph->QueryInterface(IID_IVideoWindow,   (void   **)&pVidWin);   
        HWND   hwnd   =   GetSafeHwnd();   
//        SetWindowLong(hwnd,GWL_STYLE,GetWindowStyle(hwnd) |WS_CLIPCHILDREN);
        hr = pVidWin->put_Owner((OAHWND)hwnd);
        pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS   |   WS_CLIPCHILDREN);   
        pVidWin->SetWindowPosition(0,0,400,300); //   定位播放子窗口   
            hr   =   pGraph->RenderFile(L"C\\这就是爱.avi",   NULL);   
        //hr   =   pGraph->RenderFile(L"E:\\music\\I   believe.asf",   NULL);   
        if   (SUCCEEDED(hr))   
        {   
               
                hr   =   pControl->Run();   
                if   (SUCCEEDED(hr))   
                {   
                        HWND   hwnd   =   GetSafeHwnd();   
                        hr   =   pVidWin->put_Owner((OAHWND)hwnd);   
                        long   evCode;   
                        pEvent->WaitForCompletion(INFINITE,   &evCode);   
                }   
        }   
        pControl->Release();   
        pEvent->Release();   
        pGraph->Release();   
        pVidWin->put_Visible(OAFALSE);   
        pVidWin->put_Owner(NULL);   
        CoUninitialize();  
他说肯定能用的:可是我用了以后还是和我一样的问题出现,只有卡的几声而没有图像。然后我把自己的代码加上去
hr = pVidWin->put_Owner((OAHWND)hwnd);
CString strError;
        if (!SUCCEEDED(hr))
        {
                  strError.Format(_T("put_Owner出错:%x"),hr);
                MessageBox(strError);
                strError.Format(_T("put_Owner出错:%d"),hr);
                MessageBox(strError);
                strError.Format(hr);
           MessageBox(strError);
     }
结果果然还是出现我以前的问题:
第一个对话框显示:put_Owner出错:80004002
第二个对话框显示:put_Owner出错:-2147467262
第三个对话框是空白
果然还是put_Owner()参数的问题;谁能告诉我put_Owner()里面的参数应该怎么得到阿?谢谢大家!  
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

12
 
"谁能告诉我put_Owner()里面的参数应该怎么得到阿?谢谢大家!  "

你的视频窗口所归属的父窗口,这个父窗口难道不是你自己创建的?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
TO:xjfox
我原本自己的例子里面的put_Owner()视频窗口是一个自己添加的PictureBox控件。
HWND   hWnd;   
hWnd = GetDlgItem(IDC_STATIC_MPEG)->m_hWnd;  
hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);
IDC_STATIC_MPEG就是我PictureBox控件的ID。
后来我找到的例子里面我发现是把当前的对话框用作视频窗口:
HWND   hwnd   =   GetSafeHwnd();   
hr   =   pVidWin->put_Owner((OAHWND)hwnd);   
请问大侠,难道这样创建视频窗口不对吗?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
哪位大侠知道我put_Owner()里面的参数错在哪里?或者知道应该怎么用/设置put_Owner()里面的参数?请教教我。谢谢!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
晕!怎么没有人回了啊?为什么没人能帮帮我啊?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
都是很好的建议! 值得学习
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
我知道都是很好的建议,但有没有人有一点具体的做法呢?
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

18
 
或者举个例子也可以啊!!!谢谢大家了!!!
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

19
 
已经快2个星期了,还是没有解决。晕!有谁知道的,真的能帮帮我的啊?真的谢谢了!!!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

20
 
要把graph里的filter链路建好才能行
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表