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

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2014-1-26 22:16:36 | 显示全部楼层 |阅读模式

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

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

×
这是我制作的封装类,可以把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();
下载地址:
游客,如果您要查看本帖隐藏内容请回复

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 个宅币)
回复

使用道具 举报

 楼主| 发表于 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:lay()
{
    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:ause()
{
    HRESULT hr;
    if(FAILED(hr=m_pMC->ause()))
    {
        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
回复 赞! 靠!

使用道具 举报

发表于 2014-9-2 11:07:48 | 显示全部楼层
感謝前輩提供有用的類別
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-9-27 15:37:34 | 显示全部楼层
好久没看这些帖子了。
这个是C艹的代码。嗯。C艹还是有用的。
到时候把它改成C的
回复 赞! 靠!

使用道具 举报

发表于 2016-6-24 09:33:21 | 显示全部楼层
我找了很久了, 试试用看看!
回复 赞! 靠!

使用道具 举报

发表于 2016-6-24 09:33:52 | 显示全部楼层
我找了很久了, 试试用看看!
回复 赞! 靠!

使用道具 举报

发表于 2016-6-24 09:34:08 | 显示全部楼层
我找了很久了, 试试用看看!
回复 赞! 靠!

使用道具 举报

发表于 2016-6-26 09:51:28 | 显示全部楼层
支持支持一下支持一下
回复 赞! 靠!

使用道具 举报

发表于 2016-6-26 09:51:50 | 显示全部楼层
支持支持一下支持一下
回复 赞! 靠!

使用道具 举报

发表于 2016-8-16 00:46:53 | 显示全部楼层
···················
回复 赞! 靠!

使用道具 举报

发表于 2016-8-16 00:47:13 | 显示全部楼层
飒飒似的士大夫方法微软认为
回复 赞! 靠!

使用道具 举报

发表于 2016-8-24 21:08:06 | 显示全部楼层
新人学习一下
回复 赞! 靠!

使用道具 举报

发表于 2016-8-24 21:12:08 | 显示全部楼层
#在这里快速回复#新人学习一下
回复 赞! 靠!

使用道具 举报

发表于 2016-8-24 21:13:29 | 显示全部楼层
#在这里快速回复#新人学习一下
回复 赞! 靠!

使用道具 举报

发表于 2017-4-5 14:32:51 | 显示全部楼层
....是什么东西
回复 赞! 靠!

使用道具 举报

本版积分规则

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

GMT+8, 2025-11-23 00:25 , Processed in 0.043993 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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