Chinaunix首页 | 论坛 | 博客
  • 博客访问: 498580
  • 博文数量: 96
  • 博客积分: 6046
  • 博客等级: 准将
  • 技术积分: 908
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-07 22:40
文章分类

全部博文(96)

文章存档

2009年(12)

2008年(18)

2007年(45)

2006年(21)

我的朋友

分类: C/C++

2007-07-01 20:00:34

经常在csdn.net 得到知识以及广大同胞的帮助,在此深表感谢!在很多时候都希望自己也可以为大家做点,只是....呵呵,本菜鸟实在是墨水有限,说不上什么东东。

下面是我在学习directshow编程写的一个示例程序,结构简单,贴之。望可以为一些初学者提供一个感性的认识。

相关的技术文章建议看看陆其明写的文章,嘿嘿,我就是看看他的文章开始学习directshow编程的。

//代码如下

//layer3decoder.h

#ifndef layer3decoder__h__

#define layer3decoder__h__

#include

#include

#pragma comment(lib,"strmiids.lib")

#define s_release(x)     if((x))<(x)->release();(x)=null;>

class ccominit //初始化com环境

<

public:

 ccominit();

 ~ccominit();

>;

class clayer3decoder //mp3 -> wav

<

public:

 clayer3decoder();

 ~clayer3decoder();

public:

 static hresult getpin(ibasefilter *pfilter, pin_direction pindir, ipin **pppin);

 static hresult connectfilters(igraphbuilder *pgraph, ibasefilter *pfirst, ibasefilter *psecond);

public:

 void decoder(lpctstr lpszsrc,lpctstr lpszdest);

private:

 void release(void);

private:

 igraphbuilder  *   m_pgraphbuilder;

 imediacontrol  *   m_pmediacontrol;

 ibasefilter   *   m_pfilesource;

 ibasefilter   *   m_pfiledest;

 ibasefilter   *   m_pstreamsplitter;

 ibasefilter   *   m_player3decoder;

 ibasefilter   *   m_pwavedest;

>;

#endif //layer3decoder__h__

//////////////////////

//layer3decoder.cpp

//#include "stdafx.h"

#include

//#include

//#include

#include "layer3decoder.h"

//wavdest.ax

//这个filter是directshow sdk example 中的一个例子

//编译后注册一下就可以了

// <3c78b8e2-6c4d-11d1-ade2-0000f8754b99>

static const guid clsid_wavdest =

< 0x3c78b8e2, 0x6c4d, 0x11d1, < 0xad, 0xe2, 0x0, 0x0, 0xf8, 0x75, 0x4b, 0x99 > >;

//<38be3000-dbf4-11d0-860e-00a024cfef6d>

static const guid clsid_layer3decoder =

< 0x38be3000, 0xdbf4, 0x11d0, < 0x86, 0x0e, 0x0, 0xa0, 0x24, 0xcf, 0xef, 0x6d>>;

ccominit::ccominit()

<

 ::coinitialize(null);

>

ccominit::~ccominit()

<

 ::couninitialize();

>

const ccominit  cominit = ccominit();//自动初始化com环境

clayer3decoder::clayer3decoder()

<

 m_pgraphbuilder = null;

 m_pmediacontrol = null;

 m_pfilesource = null;

 m_pfiledest = null;

 m_pstreamsplitter = null;

 m_player3decoder = null;

 m_pwavedest = null;

>

clayer3decoder::~clayer3decoder()

<

 release();

>

void clayer3decoder::release()

<

 s_release(m_pgraphbuilder);

 s_release(m_pmediacontrol);

 s_release(m_pfilesource);

 s_release(m_pfiledest);

 s_release(m_pstreamsplitter);

 s_release(m_player3decoder);

 s_release(m_pwavedest);

>

hresult clayer3decoder::getpin(ibasefilter *pfilter, pin_direction pindir, ipin **pppin)

<

    ienumpins  *penum;

    ipin       *ppin;

    pfilter->enumpins(&penum);

    while(penum->next(1, &ppin, 0) == s_ok)

    <

        pin_direction pindirthis;

        ppin->querydirection(&pindirthis);

        if (pindir == pindirthis)

        <

            penum->release();

            *pppin = ppin;

            return s_ok;

        >

        ppin->release();

    >

    penum->release();

    return e_fail; 

>

hresult clayer3decoder::connectfilters(igraphbuilder *pgraph, ibasefilter *pfirst, ibasefilter *psecond)

<

    ipin *pout = null, *pin = null;

    hresult hr = getpin(pfirst, pindir_output, &pout);

    if (failed(hr)) return hr;

    hr = getpin(psecond, pindir_input, &pin);

    if (failed(hr))

    <

        pout->release();

        return e_fail;

     >

    hr = pgraph->connect(pout, pin);

    pin->release();

    pout->release();

    return hr;

>

void clayer3decoder::decoder(lpctstr lpszsrc,lpctstr lpszdest)

<

 hresult hr = s_ok;

 wchar wfilesrc[max_path];

 wchar wfiledes[max_path];

 uses_conversion;

    wcsncpy(wfilesrc, t2w(lpszsrc),max_path);

 wcsncpy(wfiledes,t2w(lpszdest),max_path);

 ///////////////////////////////////////////

 //

 hr = ::cocreateinstance(clsid_filtergraph,null,clsctx_all,iid_igraphbuilder,(void**)&m_pgraphbuilder);

 if(hr!=s_ok)

 <

  trace("crate graph builder => failsed\n");

  release();

  return;

 >

 ////////////////////////////////////////////////

 //

 hr = m_pgraphbuilder->queryinterface(iid_imediacontrol,(void**)&m_pmediacontrol);

 if(hr!=s_ok)

 <

  trace("create mediacontrol => failsed\n");

  release();

  return;

 >

 /////////////////////////////////////////

 //建立文件读入

 hr = ::cocreateinstance(clsid_asyncreader,null,clsctx_all,iid_ibasefilter,(void**)&m_pfilesource);

 if(hr!=s_ok)

 <

  trace("create file async reader => failsed\n");

  release();

  return;

 >

 ifilesourcefilter * psrc = null;

 hr = m_pfilesource->queryinterface(iid_ifilesourcefilter,(void**)&psrc);

 if(hr!=s_ok)

 <

  trace("create file source loads filter => failsed\n");

  s_release(psrc);

  release();

  return;

 >

 hr = psrc->load(wfilesrc,null);//读入文件

 if(hr!=s_ok)

 <

  trace("load source file => failsed\n");

  s_release(psrc);

  release();

  return;

 >

 s_release(psrc);//释放文件读入

 ////////////////////////////////////////////////////

 //建立文件写入

 hr = ::cocreateinstance(clsid_filewriter,null,clsctx_all,iid_ibasefilter,(void**)&m_pfiledest);

 if(hr!=s_ok)

 <

  trace("create file write => failsed\n");

  release();

  return;

 >

 ifilesinkfilter  * pdes = null;

 hr = m_pfiledest->queryinterface(iid_ifilesinkfilter,(void**)&pdes);

 if(hr!=s_ok)

 <

  trace("create file write interface => failsed\n");

  s_release(pdes);

  release();

  return;

 >

 hr = pdes->setfilename(wfiledes,null);

 if(hr!=s_ok)

 <

  trace("set file write => failsed\n");

  s_release(pdes);

  release();

  return;

 >

 s_release(pdes);

 ////////////////////////////////////////////////////////

 //steam splitter

 hr = ::cocreateinstance(clsid_mpeg1splitter,null,clsctx_all,iid_ibasefilter,(void**)&m_pstreamsplitter);

 if(hr!=s_ok)

 <

  trace("create stream splitter => failsed\n");

  release();

  return;

 >

 ////////////////////////////////////////////////////////

 //layer 3 decoder 

 hr = ::cocreateinstance(clsid_layer3decoder,null,clsctx_all,iid_ibasefilter,(void**)&m_player3decoder);

 if(hr!=s_ok)

 <

  trace("create layer3 decoder => failsed\n");

  release();

  return;

 >

 //////////////////////////////////////////////////////////

 //wave dest

 hr = ::cocreateinstance(clsid_wavdest,null,clsctx_all,iid_ibasefilter,(void**)&m_pwavedest);

 if(hr!=s_ok)

 <

  trace("create wave dest => failsed\n");

  release();

  return;

 >

 ///////////////////////////////////////////////////////////

 // add filter into graphbuilder

 hr = m_pgraphbuilder->addfilter(m_pfilesource,l"source file");

 hr = m_pgraphbuilder->addfilter(m_pfiledest,l"dest file");

 hr = m_pgraphbuilder->addfilter(m_pstreamsplitter,l"stream splitter");

 hr = m_pgraphbuilder->addfilter(m_player3decoder,l"layer3 decoder");

 hr = m_pgraphbuilder->addfilter(m_pwavedest,l"wave dest");

 /////////////////////////////////////////////////////////////

 //connection filter

 hr = connectfilters(m_pgraphbuilder,m_pfilesource,m_pstreamsplitter);

 hr = connectfilters(m_pgraphbuilder,m_pstreamsplitter,m_player3decoder);

 hr = connectfilters(m_pgraphbuilder,m_player3decoder,m_pwavedest);

 hr = connectfilters(m_pgraphbuilder,m_pwavedest,m_pfiledest);

 //////////////////////////////////////////////////////////////

 //run

 m_pmediacontrol->run();

>

//the end
阅读(2434) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~