none
在DirectShow中發生 0X80004002 錯誤訊息 RRS feed

  • 問題

  • 在DirectShow中

    使用 m_pVideo->put_Owner((OAHWND)hWnd); 時

    會發生 0X80004002

    想請問一下這是怎麼發生的呢?

    在Google上找了很久都沒有解決方法.......

    請問各位大大有解決的方法嗎? 或是問題發生的原因?

    感謝各位~~

    2009年6月2日 上午 08:02

解答

  • 0x80004002 就是 E_NOINTERFACE (public\common\sdk\inc\winerror.h)
    在 IVideoWindow::put_Owner 裡頭發生 E_NOINTERFACE 有可能是 Graph Builder 找不到適當的 DSow Filter 所以就只好 return  E_NOINTERFACE。
    而其它手機可以用, 則有可能是那些機子有適當的 codec (DShow Filter), 但你這一台沒有。
    或許應該先試看看連 DeviceEmulator 都有辦法 playback 的 media 先 verify code 沒有問題。
    接下來再去試該 media type, 然後先在可以跑的機子上, 除了確定可 run 外, 也可以用 IFilterGraph::EnumFilters 把該 Graph 裡的 Filter 都找出來, 看看是不是有某些 DShow Filter 在 別的機子上是沒有的。

    如果你覺得我的文章以確切回答到問題, 請不吝標示為有用 and 解答.
    • 已標示為解答 mimieyes 2009年6月4日 上午 04:11
    2009年6月3日 上午 04:55

所有回覆

  • Suggest to put the fully debug message on, otherwise, we do not know what's your meaning on 0x80004002 ?
    it looks like the address in the framebuffer, but, from your question, it should be the error code, however, wince does not have this kind of error code!

    b.r.
    -Zebra @TECHWARE,

    Zebra@ eMVP
    2009年6月3日 上午 02:40
    版主
  • 感謝您的回覆

    這個程式主要是在Windows mobile上播放rtsp串流影片

    部分程式碼如下

    	JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph));
    
    	JIF(pGraph->RenderFile(url, NULL));
    
            m_pGraph = pGraph;
    
    	JIF(m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl));
    	JIF(m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&m_pVideo));
    	JIF(m_pGraph->QueryInterface(IID_IBasicVideo, (void **)&m_pBVideo));
    	JIF(m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent));
    	JIF(m_pGraph->QueryInterface(IID_IBasicAudio, (void **)&m_pAudio));
    	
    	if (m_pVideo)
    	{
    		JIF(m_pVideo->put_Owner((OAHWND)m_hParent)); 
    		JIF(m_pVideo->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS));
    		JIF(m_pVideo->put_MessageDrain((OAHWND)m_hParent));
    		JIF(m_pVideo->SetWindowPosition(m_rcClient.left, m_rcClient.top, m_rcClient.right - m_rcClient.left, m_rcClient.bottom - m_rcClient.top));
    	}
    	
    	m_pEvent->SetNotifyFlags(0);
    	m_pEvent->SetNotifyWindow((OAHWND)m_hParent, WM_APP, (long)m_pEvent);
    	m_pAudio->put_Volume(m_nVolume);
    	
    	m_nState = STOPPED;
    	m_bFullScreen = false;
    
    
    
    
    JIF() 為檢查其hr返回值, 若不正常則利用MessageBox顯示出來

    滿奇怪的就是有的手機可以正常播放

    可是在Samsung i908就是會傳回 0x80004002

    找很久都不知道原因.....






    2009年6月3日 上午 03:02
  • 試試看 將 m_pVideo->put_Owner((OAHWND)m_hParent); 修改用

    m_pVideo->put_Owner((OAHWND)GetSafeHwnd()); 替代!

    b.r.
    -Zebra @TECHWARE,
    Zebra@ eMVP
    2009年6月3日 上午 03:58
    版主
  • 0x80004002 就是 E_NOINTERFACE (public\common\sdk\inc\winerror.h)
    在 IVideoWindow::put_Owner 裡頭發生 E_NOINTERFACE 有可能是 Graph Builder 找不到適當的 DSow Filter 所以就只好 return  E_NOINTERFACE。
    而其它手機可以用, 則有可能是那些機子有適當的 codec (DShow Filter), 但你這一台沒有。
    或許應該先試看看連 DeviceEmulator 都有辦法 playback 的 media 先 verify code 沒有問題。
    接下來再去試該 media type, 然後先在可以跑的機子上, 除了確定可 run 外, 也可以用 IFilterGraph::EnumFilters 把該 Graph 裡的 Filter 都找出來, 看看是不是有某些 DShow Filter 在 別的機子上是沒有的。

    如果你覺得我的文章以確切回答到問題, 請不吝標示為有用 and 解答.
    • 已標示為解答 mimieyes 2009年6月4日 上午 04:11
    2009年6月3日 上午 04:55
  • 感謝各位的回覆

    m_hParent 為 handle


    目前就先試著把手機上的 filter 列舉出來看看

    不過還有一點就是, 本地端同格式的影片可以播放

    但是放到 server 撥 rtsp 時就會出現這個錯誤訊息

    所以有沒有可能是 rtsp 的問題? 可是別的手機又可以.....
    2009年6月3日 上午 05:43