织梦CMS - 轻松建站从此开始!

罗索

Windows Mobile 下使用DirectShow播放视频文件

jackyhwei 发布于 2010-06-24 12:37 点击:次 
以前在windows xp上做过WMP控件的播放器,所以也希望能在Windows Mobile的程序中插入WMP控件来实现,但是经过一番探索失败了,总是在窗口初始化的时候出现异常.后来决定用DirectShow来做,其实用DiretShow来做并不麻烦,而且很灵活.
TAG:

我需要在Windows Mobile上面播放3gp文件, 本来是用系统自带的WMP播放的, 但是客户认为这样子显得不专业, 一定要在自己的程序中播放视频.

我以前在windows xp上做过 WMP 控件的播放器, 所以也希望能在Windows Mobile的程序中插入WMP控件来实现, 但是经过一番探索失败了, 总是在窗口初始化的时候出现异常.

后来, 我决定用DirectShow来做, 其实用DiretShow来做并不麻烦, 而且很灵活.

1 首先要在工程中引入头文件 streams.h.

2 程序初始化的时候调用 CoInitialize , 因为DirectShow是以COM组件的形式调用的. 当然, 程序退出的时候也要调用CoUninitialize.

3 然后就可以调用接口播放视频了, 具体代码如下:

 

  1. /* 创建过滤器图管理程序并提交文件 */ 
  2.  
  3. if( S_OK != (hResult = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, 
  4.    IID_IGraphBuilder, (void **)&m_pGraph)) ) 
  5.    WRITE_LOG1("Play3GPVideo error 1 , hResult is 0x%x !\r\n", hResult); 
  6.    return FALSE; 
  7.  
  8.  
  9. if( S_OK != (hResult = m_pGraph->RenderFile(m_szVideoFile, NULL)) ) 
  10.    WRITE_LOG1("Play3GPVideo error 2 , hResult is 0x%x !\r\n", hResult); 
  11.    DestroyWindow(); 
  12.    return FALSE; 
  13.  
  14. /* 指定所有者窗口 */ 
  15.  
  16. if( S_OK != (hResult = m_pGraph->QueryInterface(IID_IVideoWindow,
  17.  (void **)&m_pVidWin)) ) 
  18.    WRITE_LOG1("Play3GPVideo error 3 , hResult is 0x%x !\r\n", hResult); 
  19.    m_pGraph->Release(); 
  20.    return FALSE; 
  21.  
  22. if( S_OK != (hResult = m_pVidWin->put_Owner((OAHWND)this->GetSafeHwnd())) ) 
  23.    WRITE_LOG1("Play3GPVideo error 5 , hResult is 0x%x !\r\n", hResult); 
  24.    m_pGraph->Release(); 
  25.    return FALSE; 
  26.  
  27. if( S_OK != (hResult = m_pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS)) ) 
  28.    WRITE_LOG1("Play3GPVideo error 4 , hResult is 0x%x !\r\n", hResult); 
  29.    m_pGraph->Release(); 
  30.    return FALSE; 
  31.  
  32. RECT grc; 
  33. ::GetClientRect(this->GetSafeHwnd(), &grc); 
  34.  
  35. if( S_OK != (hResult = m_pVidWin->SetWindowPosition(0, 0, grc.right,
  36.  grc.bottom/4*3)) ) 
  37.    WRITE_LOG1("Play3GPVideo error 6 , hResult is 0x%x !\r\n", hResult); 
  38.    m_pGraph->Release(); 
  39.    return FALSE; 
  40.  
  41. if( S_OK != (hResult = m_pVidWin->put_Visible( OATRUE )) ) 
  42.    WRITE_LOG1("Play3GPVideo error 7 , hResult is 0x%x !\r\n", hResult); 
  43.    m_pGraph->Release(); 
  44.    return FALSE; 
  45.  
  46. /* 设置所有者窗口使其接收事件通知 */ 
  47.  
  48. if( S_OK != (hResult = m_pGraph->QueryInterface(IID_IMediaEventEx,
  49.  (void **)&m_pEvent)) ) 
  50.    WRITE_LOG1("Play3GPVideo error 8 , hResult is 0x%x !\r\n", hResult); 
  51.    m_pGraph->Release(); 
  52.    return FALSE; 
  53.  
  54. if( S_OK != (hResult = m_pEvent->SetNotifyWindow((OAHWND)this->GetSafeHwnd(),
  55.  WM_GRAPHNOTIFY, 0)) ) 
  56.    WRITE_LOG1("Play3GPVideo error 9 , hResult is 0x%x !\r\n", hResult); 
  57.    m_pGraph->Release(); 
  58.    return FALSE; 
  59.  
  60. /* MediaControl接口 */ 
  61.  
  62. if ( S_OK != (hResult = m_pGraph->QueryInterface(IID_IMediaControl,
  63.  (void **)&m_pMediaControl)) ) 
  64.    WRITE_LOG1("Play3GPVideo error 10 , hResult is 0x%x !\r\n", hResult); 
  65.    m_pGraph->Release(); 
  66.    return FALSE; 
  67.  
  68. // Run the graph. 
  69. if( FAILED (hResult = m_pMediaControl->Run()) ) 
  70.    WRITE_LOG1("PlayVideoFile error , hResult is 0x%x !\r\n", hResult); 
  71.    DestroyWindow(); 
  72.    return FALSE; 

处理消息

 

  1. long evCode, param1, param2; 
  2. HRESULT hr; 
  3.  
  4. if (m_pEvent == NULL) // 避免在关闭图时发生紊乱情况 
  5.    return
  6.  
  7. while (hr = m_pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr)) 
  8.    hr = m_pEvent->FreeEventParams(evCode, param1, param2); 
  9.    if (EC_COMPLETE == evCode) 
  10.    { 
  11.     CleanUp(); 
  12.     ShowPlayMenu(); 
  13.     DestroyWindow(); 
  14.     break
  15.    } 
  16.    else if(EC_USERABORT == evCode) 
  17.    { 
  18.     CleanUp(); 
  19.     DestroyWindow(); 
  20.     break
  21.    } 

使用完之后清理的过程

 

  1. m_pVidWin->put_Visible( OAFALSE ); 
  2. m_pVidWin->put_Owner(NULL); 
  3.  
  4. // 在释放图以前禁止事件通知 
  5. m_pEvent->SetNotifyWindow(NULL, 0, 0); 
  6. m_pEvent->Release(); 
  7. m_pEvent = NULL; 
  8.  
  9. // 停止图的运行 
  10. m_pMediaControl->Stop(); 
  11.  
  12. m_pMediaControl->Release(); 
  13. m_pVidWin->Release(); 
  14. m_pGraph->Release(); 


来自:http://blog.csdn.net/li_guotao/archive/2009/09/11/4541161.aspx

(li_guotao)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201006/9710.html]
本文出处:CSDN博客 作者:li_guotao
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容