0xAA55 发表于 2014-1-26 22:16:36

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

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

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

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

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

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

//如果运行出错了,可以调用以下函数取得错误信息
g_DSTex.GetLastError();
//如果要取得COM组件返回的错误信息,调用后面的:
g_DSTex.GetLastHRESULT();
下载地址:**** Hidden Message *****
SRC:
BIN:



0xAA55 发表于 2014-1-26 22:17:38

DSTex.h头文件的内容:#ifndef _DSTEX_HEADER_INCLUDED_
#define _DSTEX_HEADER_INCLUDED_

#include<d3d9.h>
#include<d3dx9.h>
#include<streams.h>
#include<atlbase.h>

#ifndef DSTEX_EXPORT
#define DSTEX_DLL   _declspec(dllimport)
#else
#define DSTEX_DLL   _declspec(dllexport)
#endif

#define CDSERR_OK                     0   //没有错误

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

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

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

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

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

#ifndef CDSTEX_INLINE
#define CDSTEX_INLINE inline
#endif

class DSTEX_DLL CDSTex
{
private:
    template class DSTEX_DLL CComPtr<IGraphBuilder>m_pGB;          //GraphBuilder
    template class DSTEX_DLL CComPtr<IMediaControl>m_pMC;          //多媒体控制
    template class DSTEX_DLL CComPtr<IMediaPosition> m_pMP;          //多媒体位置
    template class DSTEX_DLL CComPtr<IMediaEvent>    m_pME;          //多媒体事件
    template class DSTEX_DLL CComPtr<IBaseFilter>    m_pRenderer;    //渲染器

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

    LPDIRECT3DDEVICE9       m_pDev9;

    DWORD                   m_dwErrCode;    //错误码
    HRESULT               m_hrLastHRESULT;//最后的HRESULT
public:
    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;}
    ~CDSTex()               {ReleaseDSTex();}

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

    BOOL                  GetDuration(double*);
    BOOL                  GetCurrentPosition(double*);
    BOOL                  SetCurrentPosition(double);
    BOOL                  CheckEnd();

    BOOL                  Play();
    BOOL                  Pause();
    BOOL                  Stop();

    LPDIRECT3DDEVICE9       GetDevice();
    void                  SetDevice(LPDIRECT3DDEVICE9);

    LPDIRECT3DTEXTURE9      GetTexture();
    D3DFORMAT               GetTextureFormat();

    LPTSTR                  GetMediaFile();

    DWORD                   GetVideoWidth();
    DWORD                   GetVideoHeight();

    DWORD                   GetTextureWidth();
    DWORD                   GetTextureHeight();

    BOOL                  GetFrameRate(int*);

    void                  SetLastError(DWORD dwErrCode);
    DWORD                   GetLastError();
    void                  SetLastHRESULT(HRESULT hr);
    HRESULT               GetLastHRESULT();
};

//-----------------------------------------------------------------------------
//GetDevice
//-----------------------------------------------------------------------------
CDSTEX_INLINE
LPDIRECT3DDEVICE9 CDSTex::GetDevice()
{
    return m_pDev9;
}

//-----------------------------------------------------------------------------
//SetDevice
//-----------------------------------------------------------------------------
CDSTEX_INLINE
void CDSTex::SetDevice(LPDIRECT3DDEVICE9 pDev)
{
    m_pDev9=pDev;
}

//-----------------------------------------------------------------------------
//GetMediaFile
//-----------------------------------------------------------------------------
CDSTEX_INLINE
LPTSTR CDSTex::GetMediaFile()
{
    return m_szMediaFile;
}

//-----------------------------------------------------------------------------
//SetLastError
//-----------------------------------------------------------------------------
CDSTEX_INLINE
void CDSTex::SetLastError(DWORD dwErrCode)
{
    m_dwErrCode=dwErrCode;
}

//-----------------------------------------------------------------------------
//GetLastError
//-----------------------------------------------------------------------------
CDSTEX_INLINE
DWORD CDSTex::GetLastError()
{
    return m_dwErrCode;
}

//-----------------------------------------------------------------------------
//SetLastHRESULT
//-----------------------------------------------------------------------------
CDSTEX_INLINE
void CDSTex::SetLastHRESULT(HRESULT hr)
{
    m_hrLastHRESULT=hr;
}

//-----------------------------------------------------------------------------
//GetLastHRESULT
//-----------------------------------------------------------------------------
CDSTEX_INLINE
HRESULT CDSTex::GetLastHRESULT()
{
    return m_hrLastHRESULT;
}


//-----------------------------------------------------------------------------
//GetDuration
//-----------------------------------------------------------------------------
CDSTEX_INLINE
BOOL CDSTex::GetDuration(double* pdbDuration)
{
    HRESULT hr;
    if(FAILED(hr=m_pMP->get_Duration(pdbDuration)))
    {
      this->SetLastError(CDSERR_CANNOTGETDURATION);
      this->SetLastHRESULT(hr);
      return FALSE;
    }
    else
    {
      this->SetLastError(CDSERR_OK);
      this->SetLastHRESULT(hr);
      return TRUE;
    }
}
//-----------------------------------------------------------------------------
//GetCurrentPosition
//-----------------------------------------------------------------------------
CDSTEX_INLINE
BOOL CDSTex::GetCurrentPosition(double* pdbPosition)
{
    HRESULT hr;
    if(FAILED(hr=m_pMP->get_CurrentPosition(pdbPosition)))
    {
      this->SetLastError(CDSERR_CANNOTGETPOSITION);
      this->SetLastHRESULT(hr);
      return FALSE;
    }
    else
    {
      this->SetLastError(CDSERR_OK);
      this->SetLastHRESULT(hr);
      return TRUE;
    }
}
//-----------------------------------------------------------------------------
//SetCurrentPosition
//-----------------------------------------------------------------------------
CDSTEX_INLINE
BOOL CDSTex::SetCurrentPosition(double dbPosition)
{
    HRESULT hr;
    if(FAILED(hr=m_pMP->put_CurrentPosition(dbPosition)))
    {
      this->SetLastError(CDSERR_CANNOTSETPOSITION);
      this->SetLastHRESULT(hr);
      return FALSE;
    }
    else
    {
      this->SetLastError(CDSERR_OK);
      this->SetLastHRESULT(hr);
      return TRUE;
    }
}

//-----------------------------------------------------------------------------
//Play
//-----------------------------------------------------------------------------
CDSTEX_INLINE
BOOL CDSTex::Play()
{
    HRESULT hr;
    if(FAILED(hr=m_pMC->Run()))
    {
      this->SetLastError(CDSERR_CANNOTPLAY);
      this->SetLastHRESULT(hr);
      return FALSE;
    }
    else
    {
      this->SetLastError(CDSERR_OK);
      this->SetLastHRESULT(hr);
      return TRUE;
    }
}
//-----------------------------------------------------------------------------
//Pause
//-----------------------------------------------------------------------------
CDSTEX_INLINE
BOOL CDSTex::Pause()
{
    HRESULT hr;
    if(FAILED(hr=m_pMC->Pause()))
    {
      this->SetLastError(CDSERR_CANNOTPAUSE);
      this->SetLastHRESULT(hr);
      return FALSE;
    }
    else
    {
      this->SetLastError(CDSERR_OK);
      this->SetLastHRESULT(hr);
      return TRUE;
    }
}
//-----------------------------------------------------------------------------
//Stop
//-----------------------------------------------------------------------------
CDSTEX_INLINE
BOOL CDSTex::Stop()
{
    HRESULT hr;
    if(FAILED(hr=m_pMC->Stop()))
    {
      this->SetLastError(CDSERR_CANNOTSTOP);
      this->SetLastHRESULT(hr);
      return FALSE;
    }
    else
    {
      this->SetLastError(CDSERR_OK);
      this->SetLastHRESULT(hr);
      return TRUE;
    }
}
#endif

neil 发表于 2014-9-2 11:07:48

感謝前輩提供有用的類別

0xAA55 发表于 2014-9-27 15:37:34

好久没看这些帖子了。
这个是C艹的代码。嗯。C艹还是有用的。
到时候把它改成C的

ZeroQQ 发表于 2016-6-24 09:33:21

我找了很久了, 试试用看看!

ZeroQQ 发表于 2016-6-24 09:33:52

我找了很久了, 试试用看看!

ZeroQQ 发表于 2016-6-24 09:34:08

我找了很久了, 试试用看看!:)

asip2001 发表于 2016-6-26 09:51:28

支持支持一下支持一下

asip2001 发表于 2016-6-26 09:51:50

支持支持一下支持一下

516230226 发表于 2016-8-16 00:46:53

···················

516230226 发表于 2016-8-16 00:47:13

飒飒似的士大夫方法微软认为

jason 发表于 2016-8-24 21:08:06

新人学习一下

jason 发表于 2016-8-24 21:12:08

#在这里快速回复#新人学习一下

jason 发表于 2016-8-24 21:13:29

#在这里快速回复#新人学习一下

松鼠的松 发表于 2017-4-5 14:32:51

:o....是什么东西
页: [1]
查看完整版本: C++封装类:CDSTex,实现把DirectShow显示的视频渲染到纹理