经常在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) |