level 4
newjunwei
楼主
class CDshowDecode
{
private:
AM_MEDIA_TYPE destMt;
double filelen;
int gsample;//采样率 (传进值)
int gchannel;//声道数 (传出值)
//directshow 接口定义
IGraphBuilder *pGraphall;
//函数声明
//int CopyFileWave(char * filename,char * openfilename,double start,double end,int t_sample,int channel_t);
HRESULT GetUnconnectedPin(IBaseFilter *pFilter,PIN_DIRECTION PinDir,IPin **ppPin);
HRESULT ConnectFilters(IGraphBuilder *pGraph,IBaseFilter *pSrc,IBaseFilter *pDest,int tag);
HRESULT ConnectFilters(IGraphBuilder *pGraph, IPin *pOut,IBaseFilter *pDest,int tag); HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister);
void RemoveGraphFromRot(DWORD pdwRegister);
public:
CDshowDecode()
{
pGraphall = NULL;
}
//解码并通过channel_t返回声道数
int DecodeDShow(char * srcfile,char * destfile,int sample_t,int &channel_t);
};
//释放接口
//文件截取保存函数
//int DecodeDShow(char * filename,char * openfilename,double start,double end,int t_sample,int channel_t)
int CDshowDecode ::DecodeDShow(char * srcfile,char * destfile,int sample_t,int &channel_t)
{
HRESULT hr;
IEnumFilters *pEnum1 = NULL;
IBaseFilter *pFilter=NULL;
IPin* pRpin=NULL;
IEnumPins *pEnum=NULL,*pEnum2=NULL;
IPin* pPin=NULL,*pPin2=NULL;
IPin*pDPin=NULL;
IBaseFilter * pFilter1=NULL;
IBaseFilter * VideoFilter[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
IBaseFilter *pWaveDest = NULL;
IBaseFilter *pFileWriter = NULL;
IBaseFilter *pAcmWrapper = NULL;
IFileSinkFilter *pSink=NULL;
IPin* pin2=NULL;
IMediaEvent *pEvent=NULL;
IMediaControl *pMediaControl=NULL;
IMediaFilter * pMediaFilter=NULL;
int re=1,i=0;
gsample=sample_t;
try
{
hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraphall);
if (FAILED(hr))throw"ERROR--could not create filter graph manager\n"; BSTR bstrText=CComBSTR(srcfile);
hr=pGraphall->RenderFile(bstrText,NULL);
if(FAILED(hr))throw"RenderFile failed "; //显示媒体文件为音频或者视频
FILTER_INFO FilterInfo;
hr = pGraphall->EnumFilters(&pEnum1);
if (FAILED(hr))throw"EnumFilters failed\n"; int VideoFilterNum=0;
while(pEnum1->Next(1, &pFilter, NULL) == S_OK)
{
hr = pFilter->QueryFilterInfo(&FilterInfo);
printf("%ws\n",FilterInfo.achName);
if (FAILED(hr))
{
pFilter->Release();
pFilter=NULL;
continue; // Maybe the next one will work.
}
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
pEnum->Release();
pEnum=NULL;
pFilter->Release();
pFilter=NULL;
continue; // Maybe the next one will work.
}
int PinCount=0;
AM_MEDIA_TYPE pmt;
bool bHasAudio=false;
while(pEnum->Next(1, &pPin, 0) == S_OK)
{
PinCount++;
pPin->ConnectionMediaType(&pmt);
2011年12月30日 08点12分
1
{
private:
AM_MEDIA_TYPE destMt;
double filelen;
int gsample;//采样率 (传进值)
int gchannel;//声道数 (传出值)
//directshow 接口定义
IGraphBuilder *pGraphall;
//函数声明
//int CopyFileWave(char * filename,char * openfilename,double start,double end,int t_sample,int channel_t);
HRESULT GetUnconnectedPin(IBaseFilter *pFilter,PIN_DIRECTION PinDir,IPin **ppPin);
HRESULT ConnectFilters(IGraphBuilder *pGraph,IBaseFilter *pSrc,IBaseFilter *pDest,int tag);
HRESULT ConnectFilters(IGraphBuilder *pGraph, IPin *pOut,IBaseFilter *pDest,int tag); HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister);
void RemoveGraphFromRot(DWORD pdwRegister);
public:
CDshowDecode()
{
pGraphall = NULL;
}
//解码并通过channel_t返回声道数
int DecodeDShow(char * srcfile,char * destfile,int sample_t,int &channel_t);
};
//释放接口
//文件截取保存函数
//int DecodeDShow(char * filename,char * openfilename,double start,double end,int t_sample,int channel_t)
int CDshowDecode ::DecodeDShow(char * srcfile,char * destfile,int sample_t,int &channel_t)
{
HRESULT hr;
IEnumFilters *pEnum1 = NULL;
IBaseFilter *pFilter=NULL;
IPin* pRpin=NULL;
IEnumPins *pEnum=NULL,*pEnum2=NULL;
IPin* pPin=NULL,*pPin2=NULL;
IPin*pDPin=NULL;
IBaseFilter * pFilter1=NULL;
IBaseFilter * VideoFilter[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
IBaseFilter *pWaveDest = NULL;
IBaseFilter *pFileWriter = NULL;
IBaseFilter *pAcmWrapper = NULL;
IFileSinkFilter *pSink=NULL;
IPin* pin2=NULL;
IMediaEvent *pEvent=NULL;
IMediaControl *pMediaControl=NULL;
IMediaFilter * pMediaFilter=NULL;
int re=1,i=0;
gsample=sample_t;
try
{
hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraphall);
if (FAILED(hr))throw"ERROR--could not create filter graph manager\n"; BSTR bstrText=CComBSTR(srcfile);
hr=pGraphall->RenderFile(bstrText,NULL);
if(FAILED(hr))throw"RenderFile failed "; //显示媒体文件为音频或者视频
FILTER_INFO FilterInfo;
hr = pGraphall->EnumFilters(&pEnum1);
if (FAILED(hr))throw"EnumFilters failed\n"; int VideoFilterNum=0;
while(pEnum1->Next(1, &pFilter, NULL) == S_OK)
{
hr = pFilter->QueryFilterInfo(&FilterInfo);
printf("%ws\n",FilterInfo.achName);
if (FAILED(hr))
{
pFilter->Release();
pFilter=NULL;
continue; // Maybe the next one will work.
}
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
pEnum->Release();
pEnum=NULL;
pFilter->Release();
pFilter=NULL;
continue; // Maybe the next one will work.
}
int PinCount=0;
AM_MEDIA_TYPE pmt;
bool bHasAudio=false;
while(pEnum->Next(1, &pPin, 0) == S_OK)
{
PinCount++;
pPin->ConnectionMediaType(&pmt);