恳求各位大侠帮忙,本人初次接触到DirectShow就遇到问题,折腾了两天也没有弄好,求助各位好心人:
问题是这样的:我想把硬盘上现有的视频文件比如avi.mpg的文件重新保存成wmv格式的,参考了下书上和网上的例子写下了如下的代码,发现程序没有反应,恳请帮忙。。不胜感激。
CString strName;
GetDlgItem(IDC_EDIT1)->GetWindowText(strName);
pBuilder=NULL;
pGraph=NULL;
pMC=NULL;
HRESULT hr=NOERROR;
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
IBaseFilter *pSrc,*pASFWriter = 0; CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pSrc);
CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pASFWriter);
pGraph->AddFilter(pSrc,L"FileSource(Async.)");
pGraph->AddFilter(pASFWriter,L"WM ASF Writer");
pASFWriter->QueryInterface(IID_IFileSinkFilter2,(void**)&pSink);
pSink->SetFileName(strName.AllocSysString(),NULL); IPin* pOutpin = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pInpin= FindPin(pASFWriter,PINDIR_INPUT);
//连接滤波器的引脚
pGraph->ConnectDirect(pOutpin,pInpin,NULL);
pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE, // Capture pin.
&MEDIATYPE_Video, // Video. Use MEDIATYPE_Audio for audio.
pSrc, // Pointer to the capture filter.
0,
pASFWriter); // Pointer to the sink filter (ASF Writer).
问题是这样的:我想把硬盘上现有的视频文件比如avi.mpg的文件重新保存成wmv格式的,参考了下书上和网上的例子写下了如下的代码,发现程序没有反应,恳请帮忙。。不胜感激。
CString strName;
GetDlgItem(IDC_EDIT1)->GetWindowText(strName);
pBuilder=NULL;
pGraph=NULL;
pMC=NULL;
HRESULT hr=NOERROR;
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
IBaseFilter *pSrc,*pASFWriter = 0; CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pSrc);
CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pASFWriter);
pGraph->AddFilter(pSrc,L"FileSource(Async.)");
pGraph->AddFilter(pASFWriter,L"WM ASF Writer");
pASFWriter->QueryInterface(IID_IFileSinkFilter2,(void**)&pSink);
pSink->SetFileName(strName.AllocSysString(),NULL); IPin* pOutpin = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pInpin= FindPin(pASFWriter,PINDIR_INPUT);
//连接滤波器的引脚
pGraph->ConnectDirect(pOutpin,pInpin,NULL);
pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE, // Capture pin.
&MEDIATYPE_Video, // Video. Use MEDIATYPE_Audio for audio.
pSrc, // Pointer to the capture filter.
0,
pASFWriter); // Pointer to the sink filter (ASF Writer).
解决方案 »
- CHttpFile类中read偶尔读不全网页
- listctrl中添加checkbox控件
- 请教Com高手
- 哪位高手给个思路,关于刷屏的
- gluProject和gluUnProject的问题 着急。
- CTreeCtrl 中的图标怎么样才可以突破16色限制?不要自绘了吧!
- 我在主函数里定义一个数组,将数组名按照指针类型传进一个函数,在这个函数中,怎么得到数组的大小?
- 《tcp/ip详解》这本书哪儿能下载,给个URL,多谢了
- 关于绑定文件夹的问题
- 请问在VC中要做出饼状图、条形图等形式应该怎么做?VC中有没有现成控件?
- 有文档的视图怎么理解?
- 用ado来新建一个excel文件,不需要任何设置就是一个空的excel就行
void CAvitowmvDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString strFilter=_T("AVI File (*.avi)|*.avi|");
strFilter+="All File(*.*|*.*|";
CFileDialog dlg(TRUE,NULL,NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
strFilter,this);
if(dlg.DoModal()==IDOK)
{
CString strName=dlg.GetPathName();
strName+=".wmv";
this->m_edit=strName;
UpdateData(FALSE);
Convert2Wmv(strName);
}
}
void CAvitowmvDlg::Convert2Wmv(CString fileName)
{
pBuilder=NULL;
pGraph=NULL;
pMediaControl=NULL;
HRESULT hr=NOERROR; CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void **)&pGraph);
pBuilder->SetFiltergraph(pGraph); pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
pGraph->RenderFile (fileName,NULL); CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pSrc);
pGraph->AddFilter(pSrc,L"FileSource(Async.)");
CoCreateInstance(CLSID_AviSplitter, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pAviSplitter);
pGraph->AddFilter(pAviSplitter,L"Avi Splitter"); CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_ALL,
IID_IBaseFilter, (void **)&pASFWriter);
pGraph->AddFilter(pASFWriter,L"WM ASF Writer");
pASFWriter->QueryInterface(IID_IFileSinkFilter, (void**) &pSink);
hr=pSink->SetFileName(fileName.AllocSysString(), NULL);
pSink->Release(); IPin* pOutpin1 = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pInpin1=FindPin(pAviSplitter,PINDIR_INPUT);
pGraph->ConnectDirect(pOutpin1,pInpin1,NULL);
IPin *pVideoOut =FindPin (pAviSplitter,PINDIR_OUTPUT);
IPin *pAideoOut =FindPin (pAviSplitter,PINDIR_OUTPUT);
IPin* pVideoInpin= FindPin(pASFWriter,PINDIR_INPUT);
IPin* pAideoInpin= FindPin(pASFWriter,PINDIR_INPUT); pGraph->ConnectDirect(pVideoOut,pVideoInpin,NULL);
pGraph->ConnectDirect(pAideoOut,pAideoInpin,NULL);
pMediaControl->Run ();
}
IPin * CAvitowmvDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
{
IEnumPins* pEnumPins;
IPin* pOutpin;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins); while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
{
pOutpin->QueryDirection(&pDir);
if (pDir==dir)
{
return pOutpin;
}
}
return 0;
}