找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4641|回复: 14

C++封装类:CDSTex,实现把DirectShow显示的视频渲染到纹理

[复制链接]

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24235 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-1-26 22:16:36 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这是我制作的封装类,可以把DirectShow播放的视频画面渲染到IDirect3DTexture9纹理中。用法很简单,包含这个类的头文件,然后按照如下的代码编写:

  1. //先声明这个类:
  2. CDSTex g_DSTex;

  3. //然后需要初始化,调用InitDSTex
  4. //在调用InitDSTex之前,你需要自己初始化D3D
  5. //然后给这个类指定你的IDirect3DDevice9的指针用于创建纹理。
  6. g_DSTex.InitDSTex(g_pDev9,TCHAR("C:\A.MP4"));//媒体文件为A.MP4
  7. //调用完这句之后,g_DSTex已经自动产生了一个纹理,可以用GetTexture()方法取得这个纹理的指针(LPDIRECT3DTEXUTRE9)。

  8. //开始播放
  9. g_DSTex.Play();
  10. //这里开始播放,如果媒体文件有声音,这个时候就会开始播放声音。
  11. //这个时候的纹理已经是这个视频文件的画面了。
  12. //当然如果你指定的媒体文件是MP3,也可以播放,但是只有声音没有画面,纹理是全黑的。

  13. //调用CheckEnd()检查是否已经到了媒体文件的尾部了
  14. //如果到了文件尾,CheckEnd()返回TRUE,否则返回FALSE
  15. if(g_DSTex.CheckEnd())
  16. {
  17.     MessageBoxA(NULL,"播放完了",NULL,MB_OK);
  18.     return 0;
  19. }

  20. //如果用完了这个类,必须释放。虽然析构函数也进行了释放,但是最安全可控的处理方法,是自己指定它释放。
  21. g_DSTex.ReleaseDSTex();
  22. //释放后,你仍然可以通过调用InitDSTex重新初始化,打开新的媒体,然后播放。
  23. //InitDSTex调用前必须保证g_DSTex是新的,或者已经释放过了。

  24. //如果运行出错了,可以调用以下函数取得错误信息
  25. g_DSTex.GetLastError();
  26. //如果要取得COM组件返回的错误信息,调用后面的:
  27. g_DSTex.GetLastHRESULT();
复制代码
下载地址:
游客,如果您要查看本帖隐藏内容请回复

SRC: DShow.7z (1.11 MB, 下载次数: 8, 售价: 20 个宅币)
BIN:
DebugA.7z (108 KB, 下载次数: 0, 售价: 5 个宅币)
DebugW.7z (110.97 KB, 下载次数: 0, 售价: 5 个宅币)
ReleaseA.7z (70.04 KB, 下载次数: 0, 售价: 5 个宅币)
ReleaseW.7z (69.97 KB, 下载次数: 0, 售价: 5 个宅币)
回复

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24235 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
 楼主| 发表于 2014-1-26 22:17:38 | 显示全部楼层
DSTex.h头文件的内容:
  1. #ifndef _DSTEX_HEADER_INCLUDED_
  2. #define _DSTEX_HEADER_INCLUDED_

  3. #include<d3d9.h>
  4. #include<d3dx9.h>
  5. #include<streams.h>
  6. #include<atlbase.h>

  7. #ifndef DSTEX_EXPORT
  8. #define DSTEX_DLL   _declspec(dllimport)
  9. #else
  10. #define DSTEX_DLL   _declspec(dllexport)
  11. #endif

  12. #define CDSERR_OK                       0   //没有错误

  13. #define CDSERR_CREATEGRAPHERR           1   //创建图表失败
  14. #define CDSERR_CREATETRFAILED           2   //创建TextureRenderer失败
  15. #define CDSERR_ADDFILTERFAILED          3   //把解码器加到图表失败
  16. #define CDSERR_MEDIANOTFOUND            4   //媒体文件未找到
  17. #define CDSERR_ADDSRCFILTERFAILED       5   //把源解码器加到图表失败
  18. #define CDSERR_CANNOTFINDOUTPUTPIN      6   //无法找到输出口
  19. #define CDSERR_CANNOTRENDERSRCOUTPUTPIN 7   //无法渲染源输出口

  20. #define CDSERR_CANNOTGETDURATION        8   //无法取得总时长
  21. #define CDSERR_CANNOTGETPOSITION        9   //无法取得播放进度
  22. #define CDSERR_CANNOTSETPOSITION        10  //无法设置播放进度

  23. #define CDSERR_CANNOTPLAY               11  //无法播放
  24. #define CDSERR_CANNOTPAUSE              12  //无法暂停
  25. #define CDSERR_CANNOTSTOP               13  //无法停止

  26. #define CDSERR_CANNOTGETEVENT           14  //无法取得事件
  27. #define CDSERR_CANNOTGETFPS             15  //无法取得FPS

  28. #define CDSERR_NOTINITIALIZED           16  //没有完成初始化

  29. #ifndef CDSTEX_INLINE
  30. #define CDSTEX_INLINE inline
  31. #endif

  32. class DSTEX_DLL CDSTex
  33. {
  34. private:
  35.     template class DSTEX_DLL CComPtr<IGraphBuilder>  m_pGB;          //GraphBuilder
  36.     template class DSTEX_DLL CComPtr<IMediaControl>  m_pMC;          //多媒体控制
  37.     template class DSTEX_DLL CComPtr<IMediaPosition> m_pMP;          //多媒体位置
  38.     template class DSTEX_DLL CComPtr<IMediaEvent>    m_pME;          //多媒体事件
  39.     template class DSTEX_DLL CComPtr<IBaseFilter>    m_pRenderer;    //渲染器

  40.     LPTSTR                  m_szMediaFile;  //媒体文件的文件名

  41.     LPDIRECT3DDEVICE9       m_pDev9;

  42.     DWORD                   m_dwErrCode;    //错误码
  43.     HRESULT                 m_hrLastHRESULT;//最后的HRESULT
  44. public:
  45.     CDSTex()                {m_pGB=NULL;m_pMC=NULL;m_pMP=NULL;m_pME=NULL;m_pRenderer=NULL;m_pDev9=NULL;m_dwErrCode=CDSERR_OK;m_hrLastHRESULT=S_OK;}
  46.     ~CDSTex()               {ReleaseDSTex();}

  47.     BOOL                    InitDSTex(LPDIRECT3DDEVICE9 pDev9,LPTSTR szSourceFile);
  48.     void                    ReleaseDSTex();

  49.     BOOL                    GetDuration(double*);
  50.     BOOL                    GetCurrentPosition(double*);
  51.     BOOL                    SetCurrentPosition(double);
  52.     BOOL                    CheckEnd();

  53.     BOOL                    Play();
  54.     BOOL                    Pause();
  55.     BOOL                    Stop();

  56.     LPDIRECT3DDEVICE9       GetDevice();
  57.     void                    SetDevice(LPDIRECT3DDEVICE9);

  58.     LPDIRECT3DTEXTURE9      GetTexture();
  59.     D3DFORMAT               GetTextureFormat();

  60.     LPTSTR                  GetMediaFile();

  61.     DWORD                   GetVideoWidth();
  62.     DWORD                   GetVideoHeight();

  63.     DWORD                   GetTextureWidth();
  64.     DWORD                   GetTextureHeight();

  65.     BOOL                    GetFrameRate(int*);

  66.     void                    SetLastError(DWORD dwErrCode);
  67.     DWORD                   GetLastError();
  68.     void                    SetLastHRESULT(HRESULT hr);
  69.     HRESULT                 GetLastHRESULT();
  70. };

  71. //-----------------------------------------------------------------------------
  72. //GetDevice
  73. //-----------------------------------------------------------------------------
  74. CDSTEX_INLINE
  75. LPDIRECT3DDEVICE9 CDSTex::GetDevice()
  76. {
  77.     return m_pDev9;
  78. }

  79. //-----------------------------------------------------------------------------
  80. //SetDevice
  81. //-----------------------------------------------------------------------------
  82. CDSTEX_INLINE
  83. void CDSTex::SetDevice(LPDIRECT3DDEVICE9 pDev)
  84. {
  85.     m_pDev9=pDev;
  86. }

  87. //-----------------------------------------------------------------------------
  88. //GetMediaFile
  89. //-----------------------------------------------------------------------------
  90. CDSTEX_INLINE
  91. LPTSTR CDSTex::GetMediaFile()
  92. {
  93.     return m_szMediaFile;
  94. }

  95. //-----------------------------------------------------------------------------
  96. //SetLastError
  97. //-----------------------------------------------------------------------------
  98. CDSTEX_INLINE
  99. void CDSTex::SetLastError(DWORD dwErrCode)
  100. {
  101.     m_dwErrCode=dwErrCode;
  102. }

  103. //-----------------------------------------------------------------------------
  104. //GetLastError
  105. //-----------------------------------------------------------------------------
  106. CDSTEX_INLINE
  107. DWORD CDSTex::GetLastError()
  108. {
  109.     return m_dwErrCode;
  110. }

  111. //-----------------------------------------------------------------------------
  112. //SetLastHRESULT
  113. //-----------------------------------------------------------------------------
  114. CDSTEX_INLINE
  115. void CDSTex::SetLastHRESULT(HRESULT hr)
  116. {
  117.     m_hrLastHRESULT=hr;
  118. }

  119. //-----------------------------------------------------------------------------
  120. //GetLastHRESULT
  121. //-----------------------------------------------------------------------------
  122. CDSTEX_INLINE
  123. HRESULT CDSTex::GetLastHRESULT()
  124. {
  125.     return m_hrLastHRESULT;
  126. }


  127. //-----------------------------------------------------------------------------
  128. //GetDuration
  129. //-----------------------------------------------------------------------------
  130. CDSTEX_INLINE
  131. BOOL CDSTex::GetDuration(double* pdbDuration)
  132. {
  133.     HRESULT hr;
  134.     if(FAILED(hr=m_pMP->get_Duration(pdbDuration)))
  135.     {
  136.         this->SetLastError(CDSERR_CANNOTGETDURATION);
  137.         this->SetLastHRESULT(hr);
  138.         return FALSE;
  139.     }
  140.     else
  141.     {
  142.         this->SetLastError(CDSERR_OK);
  143.         this->SetLastHRESULT(hr);
  144.         return TRUE;
  145.     }
  146. }
  147. //-----------------------------------------------------------------------------
  148. //GetCurrentPosition
  149. //-----------------------------------------------------------------------------
  150. CDSTEX_INLINE
  151. BOOL CDSTex::GetCurrentPosition(double* pdbPosition)
  152. {
  153.     HRESULT hr;
  154.     if(FAILED(hr=m_pMP->get_CurrentPosition(pdbPosition)))
  155.     {
  156.         this->SetLastError(CDSERR_CANNOTGETPOSITION);
  157.         this->SetLastHRESULT(hr);
  158.         return FALSE;
  159.     }
  160.     else
  161.     {
  162.         this->SetLastError(CDSERR_OK);
  163.         this->SetLastHRESULT(hr);
  164.         return TRUE;
  165.     }
  166. }
  167. //-----------------------------------------------------------------------------
  168. //SetCurrentPosition
  169. //-----------------------------------------------------------------------------
  170. CDSTEX_INLINE
  171. BOOL CDSTex::SetCurrentPosition(double dbPosition)
  172. {
  173.     HRESULT hr;
  174.     if(FAILED(hr=m_pMP->put_CurrentPosition(dbPosition)))
  175.     {
  176.         this->SetLastError(CDSERR_CANNOTSETPOSITION);
  177.         this->SetLastHRESULT(hr);
  178.         return FALSE;
  179.     }
  180.     else
  181.     {
  182.         this->SetLastError(CDSERR_OK);
  183.         this->SetLastHRESULT(hr);
  184.         return TRUE;
  185.     }
  186. }

  187. //-----------------------------------------------------------------------------
  188. //Play
  189. //-----------------------------------------------------------------------------
  190. CDSTEX_INLINE
  191. BOOL CDSTex::Play()
  192. {
  193.     HRESULT hr;
  194.     if(FAILED(hr=m_pMC->Run()))
  195.     {
  196.         this->SetLastError(CDSERR_CANNOTPLAY);
  197.         this->SetLastHRESULT(hr);
  198.         return FALSE;
  199.     }
  200.     else
  201.     {
  202.         this->SetLastError(CDSERR_OK);
  203.         this->SetLastHRESULT(hr);
  204.         return TRUE;
  205.     }
  206. }
  207. //-----------------------------------------------------------------------------
  208. //Pause
  209. //-----------------------------------------------------------------------------
  210. CDSTEX_INLINE
  211. BOOL CDSTex::Pause()
  212. {
  213.     HRESULT hr;
  214.     if(FAILED(hr=m_pMC->Pause()))
  215.     {
  216.         this->SetLastError(CDSERR_CANNOTPAUSE);
  217.         this->SetLastHRESULT(hr);
  218.         return FALSE;
  219.     }
  220.     else
  221.     {
  222.         this->SetLastError(CDSERR_OK);
  223.         this->SetLastHRESULT(hr);
  224.         return TRUE;
  225.     }
  226. }
  227. //-----------------------------------------------------------------------------
  228. //Stop
  229. //-----------------------------------------------------------------------------
  230. CDSTEX_INLINE
  231. BOOL CDSTex::Stop()
  232. {
  233.     HRESULT hr;
  234.     if(FAILED(hr=m_pMC->Stop()))
  235.     {
  236.         this->SetLastError(CDSERR_CANNOTSTOP);
  237.         this->SetLastHRESULT(hr);
  238.         return FALSE;
  239.     }
  240.     else
  241.     {
  242.         this->SetLastError(CDSERR_OK);
  243.         this->SetLastHRESULT(hr);
  244.         return TRUE;
  245.     }
  246. }
  247. #endif
复制代码
回复 赞! 靠!

使用道具 举报

0

主题

1

回帖

17

积分

用户组: 初·技术宅

UID
467
精华
0
威望
1 点
宅币
13 个
贡献
1 次
宅之契约
0 份
在线时间
0 小时
注册时间
2014-9-2
发表于 2014-9-2 11:07:48 | 显示全部楼层
感謝前輩提供有用的類別
回复 赞! 靠!

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24235 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
 楼主| 发表于 2014-9-27 15:37:34 | 显示全部楼层
好久没看这些帖子了。
这个是C艹的代码。嗯。C艹还是有用的。
到时候把它改成C的
回复 赞! 靠!

使用道具 举报

0

主题

3

回帖

14

积分

用户组: 初·技术宅

UID
1786
精华
0
威望
0 点
宅币
11 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2016-6-24
发表于 2016-6-24 09:33:21 | 显示全部楼层
我找了很久了, 试试用看看!
回复 赞! 靠!

使用道具 举报

0

主题

3

回帖

14

积分

用户组: 初·技术宅

UID
1786
精华
0
威望
0 点
宅币
11 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2016-6-24
发表于 2016-6-24 09:33:52 | 显示全部楼层
我找了很久了, 试试用看看!
回复 赞! 靠!

使用道具 举报

0

主题

3

回帖

14

积分

用户组: 初·技术宅

UID
1786
精华
0
威望
0 点
宅币
11 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2016-6-24
发表于 2016-6-24 09:34:08 | 显示全部楼层
我找了很久了, 试试用看看!
回复 赞! 靠!

使用道具 举报

1

主题

5

回帖

21

积分

用户组: 初·技术宅

UID
1790
精华
0
威望
1 点
宅币
13 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-6-26
发表于 2016-6-26 09:51:28 | 显示全部楼层
支持支持一下支持一下
回复 赞! 靠!

使用道具 举报

1

主题

5

回帖

21

积分

用户组: 初·技术宅

UID
1790
精华
0
威望
1 点
宅币
13 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-6-26
发表于 2016-6-26 09:51:50 | 显示全部楼层
支持支持一下支持一下
回复 赞! 靠!

使用道具 举报

0

主题

7

回帖

1

积分

用户组: 初·技术宅

UID
1896
精华
0
威望
0 点
宅币
-6 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-8-16
发表于 2016-8-16 00:46:53 | 显示全部楼层
···················
回复 赞! 靠!

使用道具 举报

0

主题

7

回帖

1

积分

用户组: 初·技术宅

UID
1896
精华
0
威望
0 点
宅币
-6 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-8-16
发表于 2016-8-16 00:47:13 | 显示全部楼层
飒飒似的士大夫方法微软认为
回复 赞! 靠!

使用道具 举报

0

主题

22

回帖

57

积分

用户组: 小·技术宅

UID
1919
精华
0
威望
0 点
宅币
35 个
贡献
0 次
宅之契约
0 份
在线时间
2 小时
注册时间
2016-8-24
发表于 2016-8-24 21:08:06 | 显示全部楼层
新人学习一下
回复 赞! 靠!

使用道具 举报

0

主题

22

回帖

57

积分

用户组: 小·技术宅

UID
1919
精华
0
威望
0 点
宅币
35 个
贡献
0 次
宅之契约
0 份
在线时间
2 小时
注册时间
2016-8-24
发表于 2016-8-24 21:12:08 | 显示全部楼层
#在这里快速回复#新人学习一下
回复 赞! 靠!

使用道具 举报

0

主题

22

回帖

57

积分

用户组: 小·技术宅

UID
1919
精华
0
威望
0 点
宅币
35 个
贡献
0 次
宅之契约
0 份
在线时间
2 小时
注册时间
2016-8-24
发表于 2016-8-24 21:13:29 | 显示全部楼层
#在这里快速回复#新人学习一下
回复 赞! 靠!

使用道具 举报

0

主题

2

回帖

11

积分

用户组: 初·技术宅

UID
2381
精华
0
威望
0 点
宅币
9 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2017-4-5
发表于 2017-4-5 14:32:51 | 显示全部楼层
....是什么东西
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 19:31 , Processed in 0.057880 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表